4
我有這個語法,有左遞歸,我不理解如何使它非左遞歸。這是我第一次使用解析器/語法等,所以請保持簡單的解釋。ANTLR - 左遞歸刪除幫助
msg: IDENTIFIER
| IDENTIFIER LBRACKET msg RBRACKET
| msg COMMA message
| LBRACE msg RBRACE LBRACE atom RBRACE
| msg XOR msg
| msg PERCENT IDENTIFIER
| IDENTIFIER PERCENT msg
| LBRACKET msg RBRACKET
;
atom: IDENTIFIER
| fn_app
;
fn_app: IDENTIFIER LBRACKET IDENTIFIER (COMMA IDENTIFIER)* RBRACKET;
我試了我自己,但ANTLR仍然說有遞歸,我不明白爲什麼。
ANTLR這樣說:
[fatal] rule msg_contents has non-LL(*) decision due to recursive rule invocations reachable from alts 1,3. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
我嘗試:
msg_contents: msg_part
| msg_part XOR msg_part
| msg_part PERCENT msg_part
;
msg_part : IDENTIFIER
| IDENTIFIER LBRACKET msg_part RBRACKET
| LBRACE msg_part RBRACE LBRACE atom RBRACE
| IDENTIFIER PERCENT msg_part
| LBRACKET msg_part RBRACKET
;
請幫助。謝謝!
P.s.如果可能的話,請提供關於如何從這種語法中刪除遞歸的解釋或步驟。
完美!謝謝!我也能夠理解A = Ax | Ÿ我從維基百科無法理解的事情。現在我知道它是如何應用的。 – 2012-07-09 22:45:53