2009-11-24 4 views
6

私はAntlrをテキストのようなIDEのような関数に使用しようとしています。具体的にはファイルを解析してコードの折りたたみポイントを特定し、構文ハイライトを適用します。ANTLRのツリーを理解する

最初の質問 - Antlrはこの要件に適していますか、それとも過剰ですか?このとすることができます。正規表現や手書きパーサを使って実現できますが、Antlrがこの作業をするために用意されているようです。

私は見てきました...そして優れたチュートリアルリソースhere

私はJava文法(standard grammarを使用)を構築し、すべてのものをきれいに解析してツリーにすることができました。しかし、ツリー内に要素がネストされていることが予想されました。実際には、すべてが一番上の要素の子です。

例:与えられた:

package com.example 
public class Foo { 
    String myString = "Hello World" 
    // etc 
} 

私は、Fooのツリーノードがパッケージ宣言のノードの子であると予想していました。同様に、myStringはFooの子になります。

代わりに、私はFoomyString(それ以外についてはすべて)がすべてpackageの子であることを確認しています。

public void init() throws Exception { 
    CharStream c = new ANTLRFileStream(
      "src/com/inversion/parser/antlr/Test.code"); 

    Lexer lexer = new JavaLexer(c); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    JavaParser parser = new JavaParser(tokens); 
    parser.setTreeAdaptor(adaptor); 

    compilationUnit_return result = parser.compilationUnit(); 
} 

static final TreeAdaptor adaptor = new CommonTreeAdaptor() { 
    public Object create(Token payload) { 
     if (payload != null) 
     { 
      System.out.println("Create " + JavaParser.tokenNames[payload.getType()] + ": L" + payload.getLine() + ":C" + payload.getCharPositionInLine() + " " + payload.getText()); 
     } 
     return new CommonTree(payload); 
    } 
}; 

result.getTree()戻ってその子供解析の結果であるCommonTreeインスタンスを、調べる:

はここで解析を行って、関連の抜粋です。 (おそらく間違って)

期待値

package com.example (4 tokens) 
    | 
    +-- public class Foo (3 tokens) 
     | 
     +--- String myString = "Hello World" (4 tokens) 
     +--- Comment "// etc" 

(または類似したもの)

実際の値

package 
com 
. 
example 
public 
class 
Foo 
String 
myString 
= 
"Hello World" 
(すべての値は result.getTree()のルート・ノードの子です)

これがどのように正しく動作するかを理解していますか?

これまでAntlrの完全な騒ぎであり、私は学習曲線がかなり険しいと感じています。

+0

ツリーを見つけたらツリーを表示し、予想通りにツリーを表示できますか? – Svante

+3

ところで、正規表現では、非正規言語を解析することはできません。 「木」、「再帰」、「入れ子」と表示されている場合は、「正規表現がない」と考えてください。 – Svante

+0

@Svante - 確かに - 私はポストの予想と対比を拡大しました。お役に立てれば。 –

答えて

6

antlr.org上のファイル共有部分の上部にあるJavaの-6の文法は、木の建物が含まれていません。あなたは2つのことをする必要があります。まず、あなたはASTを構築したいANTLRを伝える:

options { 
    output=AST; 
} 

第二に、あなたは木がいずれかの方法で、ツリー演算子を使用するか、書き換えルールを使用してどのように見えるか、それを伝える必要があります。 documentation on tree constructionを参照してください。私は通常両方の組み合わせを終わらせる。

1

ツリーを構築するには、output = ASTを設定する必要があります。 (抽象構文木)

私が知る限り、ANTLRでは1つのトークンだけがツリーのルートになる可能性がありますので、探しているものを正確に取得することはできませんが、近づけることができます。

チェックアウト: http://www.antlr.org/wiki/display/ANTLR3/Tree+construction

関連する問題