ANTLR4:TokenStreamRewriter输出没有正确的格式(删除空格)

时间:2014-02-19 18:21:20

标签: parsing antlr token antlr4 lexer

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:16)

问题是词法分析器没有向解析器发送空格,这意味着重写流也无法访问令牌。这是因为skip lexer命令:

WS : [ \t\r\n\u000C]+ -> skip ;

您必须将所有这些更改为-> channel(HIDDEN),它们会将它们发送到另一个通道上的解析器,使它们在令牌流中可用,但对解析器不可见。