如何在javascript中进行antlr重写TokenStream
我正在尝试使用antlr生成javascript代码。并使用它来更改语法中的标记(节点) 我可以访问节点,输入节点并打印值,或退出节点并打印节点值。 如果节点是表达式,我想替换它的标记 就像表达式是+1一样,我想将表达式替换为replacedString+1如何在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
/**
* @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”语法可能会使你的考试更完整,从而更容易重复