我正在使用Antlr4和java7语法(source)修改输入的Java源文件。更具体地说,我正在使用TokenStreamRewriter类来修改一些 token 。以下代码是显示如何修改 token 的示例:

public class TestListener extends JavaBaseListener {
   private TokenStreamRewriter rewriter;
   rewriter = new TokenStreamRewriter(tokenStream);
   rewriter.replace(ctx.getStart(), ctx.getStop(), "someText");
}

当我打印更改后的源代码时,空格和制表符将被删除,新的源文件的格式如下:

importjava.util.ArrayList; publicclassMain {publicstaticvoidmain(String [] args {MyTimertimer = newMyTimer();}}

我正在使用extractor.getText()将其打印回来。

这是语法使用上的问题吗?还是应该使用TokenStreamRewriter类中的其他方法?

最佳答案

问题在于词法分析器没有将空白发送给解析器,这意味着重写流也无法访问 token 。这是因为skip lexer命令:
WS : [ \t\r\n\u000C]+ -> skip ;
您必须将所有这些更改为-> channel(HIDDEN),然后将它们发送到其他 channel 上的解析器,使它们在 token 流中可用,但对解析器不可见。

10-06 10:22