2011-11-26 58 views
1

當我與輸入執行以下語法(3),I獲得該解析樹:ANTLR遞歸

enter image description here

它不能識別的閉括號。可能是什麼問題

term 
    : IDENT | '(' term ')' | INTEGER 
    ; 

INTEGER : '0'..'9'+; 
IDENT : ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')*; 
WS : (' ' | '\t' | '\r' | '\n' | '\f')+{$channel = HIDDEN;}; 
+0

恐怕你的圖片鏈接不適合我,所以我不能確定你看到了什麼行爲。 – Gian

+0

我編輯了鏈接,謝謝 – akaya

回答

1

語法沒有問題。看起來您正在使用Eclipse ANTLR插件,該插件依次使用ANTLRWorks的解釋器。這個解釋是出了名的越野車:如果你得到意想不到的行爲,始終運行手動測試,或使用ANTLRWorks'調試程序,其調試輸入"(3)"這樣的:

enter image description here

要啓動ANTLRWors調試器,選擇菜單運行>>調試或按CTL + D

1

我認爲這可能是UI中的一個錯誤。我認爲解析器看到了)。你有沒有嘗試從Java調用解析器?

public static void main(String[] args) 
    throws Exception 
{ 
    // TODO Auto-generated method stub 
    ANTLRStringStream strstrm = new ANTLRStringStream("(3)"); 
    ffLexer lex = new ffLexer(strstrm); 
    CommonTokenStream tokStrm = new CommonTokenStream(lex); 
    ffParser prs = new ffParser(tokStrm); 
    prs.term(); 

} 

如果添加一個動作你的長期規則:

term 
    : IDENT | a='(' term b=')' {System.out.println($a.text + " " + $b.text);} | INTEGER 
    ; 

你應該得到的輸出

() 

另外,如果你創建另一個解析器規則:

prog: term+; 

然後給出輸入(3)(4)(5)解析樹如預期