我有这个具有左递归的语法,但我不明白如何使它成为非左递归的。这是我第一次使用解析器/语法等,所以请保持任何解释简单。
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
;
请帮忙。谢谢!
Ps 如果可能,请提供有关如何从此类语法中删除递归的说明或步骤。