我是AntLR的新手,我正在努力做以下事情:
我想要做的是,在解析源文件(当然,我有一个有效的语法)并将AST存储在内存中后,通过访问者API去更改一些内容,然后再将其打印出来。
例如:
有没有办法在AntLR中做这些事情,或者我所走的方向非常错误?
我想要做的是,在解析源文件(当然,我有一个有效的语法)并将AST存储在内存中后,通过访问者API去更改一些内容,然后再将其打印出来。
例如:
int foo() {
y = x ? 1 : 2;
}
并将其转化为:
int foo() {
if (x) {
y = 1;
else {
y = 2;
}
}
到目前为止,我已经有了解析这样的语法所需的适当语法,并且还编写了一些访问者方法,在正确位置时会调用这些方法。令我困惑的是,在访问期间我无法更改文本。
理想情况下,我希望有这样的功能:
public Void visitTernExpr(SimpleCParser.TernExprContext ctx) {
ctx.setText("something");
return null;
}
在我的主程序中,我希望将这个AST通过不同的访问者进行编辑,每个访问者都专门从事某些工作。 就像这样:
ANTLRInputStream input = new ANTLRInputStream(new FileInputStream(filename));
SimpleCLexer lexer = new SimpleCLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
SimpleCParser parser = new SimpleCParser(tokens);
ProgramContext ctx = parser.program();
MyChecker1 mc1 = new MyChecker1();
mc1.visit(ctx);
MyChecker2 mc2 = new MyChecker2();
mc1.visit(ctx);
ctx.printToFile("myfile");
有没有办法在AntLR中做这些事情,或者我所走的方向非常错误?