如何在javascript中进行antlr重写TokenStream

如何在javascript中进行antlr重写TokenStream,javascript,node.js,antlr,antlr4,Javascript,Node.js,Antlr,Antlr4,我正在尝试使用antlr生成javascript代码。并使用它来更改语法中的标记(节点) 我可以访问节点,输入节点并打印值,或退出节点并打印节点值。 如果节点是表达式,我想替换它的标记 就像表达式是+1一样,我想将表达式替换为replacedString+1 /** * @author:saurabh * sample programme to run the parser for a sample string using antlr */ /** * dependency inje

我正在尝试使用antlr生成javascript代码。并使用它来更改语法中的标记(节点)

我可以访问节点,输入节点并打印值,或退出节点并打印节点值。 如果节点是表达式,我想替换它的标记

就像表达式是+1一样,我想将表达式替换为replacedString+1

/**
 * @author:saurabh
 * sample programme to run the parser for a sample string using antlr
 */

/**
 * dependency injection
 */
var antlr4 = require('antlr4/index');
var helloListener = require('./helloListener').helloListener;
var helloLexer = require('./helloLexer');
var helloParser = require('./helloParser');
var helloVisitor = require('./helloVisitor').helloVisitor;

var toRun = function (ruleForEnterAndExitOverride,ruleForgeneratiingTree, inputExpressionString, changeTokenString) {
    var chars = new antlr4.InputStream(inputExpressionString);
    var lexer = new helloLexer.helloLexer(chars);
    var tokens = new antlr4.CommonTokenStream(lexer);
    var parser = new helloParser.helloParser(tokens);
    console.log(tokens)
    //var visitor = new helloVisitor.helloVisitor();
    parser.buildParseTrees = true;
    var tree = parser.expression();
    var keyPrinter = function () {
        helloListener.call(this);
        return this;
    };
    keyPrinter.prototype = Object.create(helloListener.prototype);
    keyPrinter.prototype.constructor = keyPrinter;
    //visitor
    var keyVisitor = function(){
        helloVisitor.call(this);
        return this;
    }
    keyVisitor.prototype = Object.create(helloVisitor.prototype);
    keyVisitor.prototype.constructor = keyVisitor;


    //var tree1 = parser.prog();

    //override funciton
    keyPrinter.prototype["enter" + ruleForEnterAndExitOverride] = function (ctx) {
        //var newVal = ctx.getText().replace(ctx.getText(),changeTokenString);
        console.log("enter"+ctx.getText());
        console.log("enter",ctx.start,ctx.end)
        //console.log(ctx.quotedIdentifier())
        return "hi";
    }
    keyPrinter.prototype["exit"+ ruleForEnterAndExitOverride] = function (ctx) {
        //var newVal = ctx.getText().replace(ctx.getText(),changeTokenString);
        console.log("exit"+ctx.getText());
    }
    keyVisitor.prototype["visit"+ruleForEnterAndExitOverride] = function(ctx){
        console.log("visit"+ctx.getText())
        //var newString = ctx.getText().replace(ctx.getText(),changeTokenString);
        //return newString;
        //console.log(ctx)
    }
    var visitor = new keyVisitor();
    var test = visitor["visit"+ruleForEnterAndExitOverride](tree);
    var printer = new keyPrinter();
     antlr4.tree.ParseTreeWalker.DEFAULT.walk(printer, tree);
    //console.log("out",test)

}
/**
 * @param: ruleFor appending to the listner funciton (starts with capital character of rule name)
 * @param: rule name to generate tree. without any change
 * @param: expression to test
 * @param: new value to be replaced from the @param3 expression
 */
toRun("QuotedIdentifier","quotedIdentifier", "`a`+1", "p");
在antlr的java文档中提到了使用RewriteableTokenstreem,但我找不到一种在javascript中使用同样的方法

请帮助

提供“Hello”语法可能会使你的考试更完整,从而更容易重复