2011-07-08 98 views
1

我一直在努力學習ANTLR了一段時間,終於拿到了我的手權威ANTLR參考。 嗯,我嘗試了以下的ANTLRWorks 1.4ANTLRWorks:無法獲得運營商合作

grammar Test; 

INT : '0'..'9'+ 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

expression 
    : INT ('+'^ INT)*; 

當我通過2 + 4,處理的表情,我沒有得到一個樹+爲根,2和4的子節點。相反,我得到表達式作爲根,2,+和4作爲子節點處於同一級別。

不能找出我做錯了。絕對需要幫助。

BTW我怎樣才能得到這些圖形的描述?

+0

發現這個[http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-a -net環境(http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-a-net-environment)告訴如何讓圖形表示。還有一條評論提到antlrworks解釋器忽略了操作!和^ – Puneet

回答

1

是的,你得到了表達,因爲它是你的唯一的規則expression正在返回的表達式。

我剛纔添加虛擬標誌​​你的例子與重寫的表達,顯示您的期待結果一起。 但似乎你已經找到了解決辦法:O)

grammar Test; 

options { 
    output=AST; 
    ASTLabelType = CommonTree; 
} 
tokens {PLUS;} 

@members { 
    public static void main(String [] args) { 
      try { 
      TestLexer lexer = 
       new TestLexer(new ANTLRStringStream("2+2")); 
      CommonTokenStream tokens = new CommonTokenStream(lexer); 
      TestParser parser = new TestParser(tokens); 
      TestParser.expression_return p_result = parser.expression(); 

      CommonTree ast = p_result.tree; 
      if(ast == null) { 
       System.out.println("resultant tree: is NULL"); 
      } else { 
       System.out.println("resultant tree: " + ast.toStringTree()); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
     } 
} 

expression 
    : INT ('+' INT)* -> ^(PLUS INT+); 

INT : '0'..'9'+ 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ;