Parsing ANTLR4:TokenStreamRewriter输出不';没有正确的格式(删除空白)

Parsing ANTLR4:TokenStreamRewriter输出不';没有正确的格式(删除空白),parsing,antlr,token,antlr4,lexer,Parsing,Antlr,Token,Antlr4,Lexer,我正在使用Antlr4和java7语法()修改输入Java源文件。更具体地说,我使用TokenStreamRewriter类来修改一些令牌。以下代码是显示如何修改令牌的示例: public class TestListener extends JavaBaseListener { private TokenStreamRewriter rewriter; rewriter = new TokenStreamRewriter(tokenStream); rewriter.

我正在使用Antlr4和java7语法()修改输入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类中的其他方法?

问题是lexer没有向解析器发送空白,这意味着重写流也没有访问令牌的权限。这是因为skip lexer命令:


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


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

非常感谢您的快速回复。建议的文件更改(Java.g4)工作正常。在上下文中,间隔边界被存储,并且有办法访问整个inputStream,它检索所有文本,而不管跳过或隐藏通道。TokenStreamRewriter从根本上被打破,因为它既不允许访问原始流开始/停止索引,也不允许重载节点GetText,因此我们可以获取实际的TokenStreamRewriter上的l text.GetText()没有任何用途。这就是为什么您必须大量修改语法。可以逐个标记调用TokenStreamRewriter.GetText()标记,跟踪所有上下文间隔并添加从上下文遍历中检索到的空白。。。