我正在嘗試使用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"
(或類似的東西)
實際值(所有值都是result.getTree()
根節點的孩子)
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"
我理解這應該如何正確工作?
到目前爲止,我是Antlr的完整noob,我發現學習曲線非常陡峭。
你可以根據你的需求顯示樹狀結構嗎? – Svante 2009-11-24 15:17:50
順便說一句,解析非正則語言不能用正則表達式來實現。無論何時看到「樹」,「遞歸」或「嵌套」,都認爲「無正則表達式」。 – Svante 2009-11-24 15:20:27
@Svante - 當然 - 我已經在帖子中擴展了預期vs實際。希望這可以幫助。 – 2009-11-24 16:04:14