2013-05-02 8 views
24

Java 7の文法を使用https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4特定の名前のメソッドを見つけて、そのメソッドを印刷したいと思っています。私は一致するときにmethodDeclarationルールを使用できることがわかります。だから私はJava7BaseListenerをサブクラス化し、このリスナーメソッドをオーバーライド:antlr4ルールと一致する元のテキストを取得するにはどうすればよいですか?

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

は、どのように私は、元のテキストを得るのですか? ctx.getText()は、すべての空白を取り除いた文字列を返します。コメントと元の書式が必要です。

答えて

32

ANTLRのCharStreamクラスには、与えられた範囲の元のソースを返すメソッドgetText(Interval interval)があります。 Contextオブジェクトには、開始と終了を取得するメソッドがあります。あなたはCharStreamが解析されていinputと呼ばれるリスナーのフィールドを持っていると仮定すると、あなたはこれを行うことができます。

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

をあなたがアクセス権を持っていないか、 'CharStream'を追跡したくない場合は、それを取得するには 'ctx.start.getInputStream()'を使います。 – Peter

+0

CharStream input = ctx.start.getInputStream(); input.getText(interval); ランタイムエラーが発生します.checkBoundsOffCount(String.java:3101) –

+0

そして、それでも失敗しない場合でも、空白は削除されます –

関連する問題