2012-05-02 141 views
1

我有一個ANTLR語法問題,我只是沒有看到我的問題,一直想弄明白一個多小時。我剝我的問題到這個簡單的語法:ANTLR語法問題

 grammar TestGrammar; 

     options { 
      language = Java; 
      k=2; 
     } 

     compu_method : '/begin COMPU_METHOD' NAME NAME NAME NAME 
       (
       (formula) 
       |('COEFFS' realnumber realnumber realnumber realnumber realnumber realnumber) 
      )* 
       '/end COMPU_METHOD'; 

      formula : '/begin FORMULA' (.)* '/end FORMULA'; 

      realnumber: (INT | FLOAT); 

     NAME : LETTER (LETTER|'0'..'9'|'['|']'|'.')* ; 
     fragment LETTER : 'A'..'Z' | 'a'..'z' | '_' ; 

     INT : MINUS? ('0' | '1'..'9' '0'..'9'*) ; 
     FLOAT : MINUS? ('0'..'9')+ '.' ('0'..'9')* Exponent? | MINUS? '.' ('0'..'9')+ Exponent? | MINUS? ('0'..'9')+ Exponent ; 
     MINUS : '-' ; 
     fragment Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 

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

,我試圖以匹配輸入是:

/begin COMPU_METHOD 
     foo 
     foo 
     foo 
     foo 
     COEFFS 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 
/end COMPU_METHOD 

口譯總是給我「不匹配輸入‘COEFFS’期待‘\ u0005’ 「

但是爲什麼?

如果我在語法中改變(公式)和('COEFFS'...)的順序,那很好,我只是不明白爲什麼?

回答

1

修復錯誤之後(在compu_method中有一個無效的N標記,並且您在formula規則後忘記了一個分號),我沒有任何問題解析輸入。我碰到下面的分析樹:

enter image description here

請注意,我使用的調試,而不是解釋(這是越野車)。所以你的問題可能是你使用瞭解釋器。

+0

我該如何使用調試器而不是解釋器? – metacircle

+0

假設你正在使用ANTLRWorks:按下「CTRL + D」。如果你使用Eclipse的ANTLR插件(它使用ANTLRWorks,AFAIK的解釋器和調試器組件):我不知道。 –