2009-11-24 53 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" 

(或類似的東西)

實際值(所有值都是result.getTree()根節點的孩子)

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

我理解這應該如何正確工作?

到目前爲止,我是Antlr的完整noob,我發現學習曲線非常陡峭。

+0

你可以根據你的需求顯示樹狀結構嗎? – Svante 2009-11-24 15:17:50

+3

順便說一句,解析非正則語言不能用正則表達式來實現。無論何時看到「樹」,「遞歸」或「嵌套」,都認爲「無正則表達式」。 – Svante 2009-11-24 15:20:27

+0

@Svante - 當然 - 我已經在帖子中擴展了預期vs實際。希望這可以幫助。 – 2009-11-24 16:04:14

回答

6

在文件共享區間的上antlr.org頂部的Java的語法6不包括樹構建。你需要做兩件事。首先,告訴ANTLR你想建立一個AST:

options { 
    output=AST; 
} 

其次,你需要告訴它的樹應該是什麼樣子,通過使用樹或者運營商或使用重寫規則。請參閱documentation on tree construction。我通常最終將兩者結合起來。