6

私はいくつかのテキストIDEのような機能にAntlrを使用しようとしています。具体的には、ファイルを解析してコード折り畳みのポイントを特定し、構文の強調表示を適用します。

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

...と優れたチュートリアルリソースをここで確認しました。

私は(標準の文法を使用して)Java文法を構築し、すべてをきちんと解析してツリーにすることができました。ただし、ツリー内にネストされた要素が表示されることを期待していました。実際には、すべてが最上位の要素の子です。

例えば。与えられた:

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

Fooのツリーノードがパッケージ宣言のノードの子になることを期待していました。同様に、myStringはFooの子になります。

代わりに、私はそれと(FooそしてmyStringそのことに関する他のすべて)はすべての子であることに気づいています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"

(または同様のもの)

実際の値(すべての値はのルートノードの子ですresult.getTree()

package
com
.
example
public
class
Foo
String
myString
=
"Hello World"

これがどのように正しく機能するかについての私の理解はありますか?

私はこれまでのところAntlrの完全な初心者であり、学習曲線はかなり急であると感じています。

4

2 に答える 2

6

antlr.orgのファイル共有セクションの上部にあるJava-6文法には、ツリー構築は含まれていません。2つのことをする必要があります。まず、ASTを構築することをANTLRに伝えます。

options {
    output=AST;
}

次に、ツリー演算子を使用するか、書き換えルールを使用して、ツリーがどのように表示されるかを指定する必要があります。ツリー構築に関するドキュメントを参照してください。私は通常、両方の組み合わせを行うことになります。

于 2009-12-03T19:13:36.967 に答える
1

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

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

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

于 2009-11-24T18:15:19.357 に答える