Java 如何获取antlr4规则匹配的原始文本?

Java 如何获取antlr4规则匹配的原始文本?,java,antlr,antlr4,Java,Antlr,Antlr4,使用Java7语法,我想找到具有特定名称的方法,然后打印出该方法。我发现我可以在匹配时使用methodDeclaration规则。因此,我将子类化Java7BaseListener并重写此侦听器方法: @Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { } 我怎样才能把原文拿出来ctx.getText()给我一个字符串,其中去掉了所有空格。我需要注释和原始格式。ANTL

使用Java7语法,我想找到具有特定名称的方法,然后打印出该方法。我发现我可以在匹配时使用
methodDeclaration
规则。因此,我将子类化
Java7BaseListener
并重写此侦听器方法:

@Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { }

我怎样才能把原文拿出来
ctx.getText()
给我一个字符串,其中去掉了所有空格。我需要注释和原始格式。

ANTLR的
CharStream
类有一个方法
getText(Interval)
,它将返回给定范围内的原始源代码。
上下文
对象具有获取开头和结尾的方法。假设侦听器中有一个名为
input
的字段,其中包含正在解析的字符流,则可以执行以下操作:

    int a = ctx.start.getStartIndex();
    int b = ctx.stop.getStopIndex();
    Interval interval = new Interval(a,b);
    input.getText(interval);
演示:


如果您无权访问或不想跟踪
CharStream
,请使用
ctx.start.getInputStream()
检索它。CharStream input=ctx.start.getInputStream();input.getText(interval);给我运行时错误。checkBoundsOffCount(String.java:3101)并且在没有失败的地方它仍然会删除空白。您的回答帮助我修复了一个奇怪的错误,在
令牌上调用
getText()
失败,因为我的原始
CharStream
被垃圾收集。我保留了对它的引用,并且
getText
现在可以工作了。另请参见和。
SqlBaseParser.QueryContext queryContext = context.query();
int a = queryContext.start.getStartIndex();
int b = queryContext.stop.getStopIndex();
Interval interval = new Interval(a,b);
String viewSql = context.start.getInputStream().getText(interval);