web-dev-qa-db-ja.com

antlr4ルールが一致した元のテキストを取得するにはどうすればよいですか?

Java 7文法 https://github.com/antlr/grammars-v4/blob/master/Java7/Java7.g4 を使用してメソッドを見つけたい特定の名前を付けて、そのメソッドを出力します。一致したときにmethodDeclarationルールを使用できることがわかります。そこで、_Java7BaseListener_をサブクラス化し、このリスナーメソッドをオーバーライドします。

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

元のテキストを取り出すにはどうすればよいですか? ctx.getText()は、すべての空白を取り除いた文字列を表示します。コメントとオリジナルのフォーマットが欲しいです。

37
monty0

ANTLRのCharStreamクラスにはメソッドgetText(Interval interval)があり、指定範囲内の元のソースを返します。 Contextオブジェクトには、開始と終了を取得するメソッドがあります。リスナーにinputというフィールドがあり、CharStreamが解析されているとすると、次のように実行できます。

    int a = ctx.start.getStartIndex();
    int b = ctx.stop.getStopIndex();
    Interval interval = new Interval(a,b);
    input.getText(interval);
47
monty0

デモ:

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);
7
ideal