私はAntlrをテキストのようなIDEのような関数に使用しようとしています。具体的にはファイルを解析してコードの折りたたみポイントを特定し、構文ハイライトを適用します。ANTLRのツリーを理解する
最初の質問 - Antlrはこの要件に適していますか、それとも過剰ですか?このはとすることができます。正規表現や手書きパーサを使って実現できますが、Antlrがこの作業をするために用意されているようです。
私は見てきました...そして優れたチュートリアルリソースhere。
私はJava文法(standard grammarを使用)を構築し、すべてのものをきれいに解析してツリーにすることができました。しかし、ツリー内に要素がネストされていることが予想されました。実際には、すべてが一番上の要素の子です。
例:与えられた:
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"
(または類似したもの)
実際の値が
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"
(すべての値は
result.getTree()
のルート・ノードの子です)
これがどのように正しく動作するかを理解していますか?
これまでAntlrの完全な騒ぎであり、私は学習曲線がかなり険しいと感じています。
ツリーを見つけたらツリーを表示し、予想通りにツリーを表示できますか? – Svante
ところで、正規表現では、非正規言語を解析することはできません。 「木」、「再帰」、「入れ子」と表示されている場合は、「正規表現がない」と考えてください。 – Svante
@Svante - 確かに - 私はポストの予想と対比を拡大しました。お役に立てれば。 –