2012-03-02 65 views
3

對於question和@BartKiers建議的語法(謝謝!),我增加了options塊指定輸出爲生成AST

options{ 
language=Java; 
output=AST; 
ASTLabelType=CommonTree; 
} 

但是,我不能圖瞭解如何訪問輸出即AST。我需要遍歷樹並處理輸入中指定的每個操作。


使用您的示例here,我試圖實現返回值的規則。但是,我遇到了以下錯誤:

relational returns [String val]     
     : STRINGVALUE ((operator)^ term)? 
      {val = $STRINGVALUE.text + $operator.text + $term.text; } 
            ; 

term returns [String rhsOperand]      
     : QUOTEDSTRINGVALUE {rhsOperand = $QUOTEDSTRINGVALUE.text;} 
            | NUMBERVALUE    {rhsOperand = $NUMBERVALUE.text; } 
            | '(' condition ')' 
            ; 

編譯錯誤:

Checking Grammar RuleGrammarParser.g... 
\output\RuleGrammarParser.java:495: cannot find symbol 
symbol : variable val 
location: class RuleGrammarParser 
      val = (STRINGVALUE7!=null?STRINGVALUE7.getText():null) + (operator8!=null?input.toString(operator8.start,operator8.stop):null) + (term9!=null?input.toString(term9.start,term9.stop):null); 
      ^
\output\RuleGrammarParser.java:612: cannot find symbol 
symbol : variable rhsOperand 
location: class RuleGrammarParser 
        rhsOperand = (QUOTEDSTRINGVALUE10!=null?QUOTEDSTRINGVALUE10.getText():null); 
        ^
\output\RuleGrammarParser.java:632: cannot find symbol 
symbol : variable rhsOperand 
location: class RuleGrammarParser 
        rhsOperand = (NUMBERVALUE11!=null?NUMBERVALUE11.getText():null); 
        ^
3 errors 

能否請你幫我明白爲什麼這個不能編譯器?


添加了引擎收錄:http://pastebin.com/u1Bv3L0A

+0

不客氣的黑暗。 – 2012-03-02 17:03:17

回答

4

通過簡單地添加output=ASToptions節你不創建一個AST,但令牌的平坦,1名維列表。要將某些標記標記爲根(或子),您需要做一些工作。

結帳this answer這也解釋瞭如何創建一個適當的AST 獲取訪問的樹,解析器產生(在CommonTree tree在我提到的回答main方法)。

請注意,您可以安全地刪除language=Java;:默認情況下,目標語言是Java(儘管如此,仍然沒有傷害)。

+0

太棒了!三個歡呼@BartKiers! (&那韻:)) – 2012-03-02 17:23:04

+0

你能幫我解決我的問題嗎?我已經更新了這個問題。 – 2012-03-02 22:00:17

+0

巴特,找到了修復。也許你必須更新你的例子來爲規則中定義的所有變量包含'$'。 – 2012-03-02 22:45:41