私はいくつかのテキスト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の完全な初心者であり、学習曲線はかなり急であると感じています。