[英]How to remove indirect left-recursion from grammar
我有一些相互左遞歸的ANTLR代碼:
expr: int_liter
| bool_liter
| char_liter
| str_liter
| pair_liter
| ident
| array_elem
| unary_oper expr
| expr binary_oper expr
| OPEN_PARENTHESES expr CLOSE_PARENTHESES
;
array_elem: expr OPEN_BRACKET expr CLOSE_BRACKET ;
有想法該怎么解決這個嗎?
ANTLR 4只能處理直接左遞歸,但是您的語法包含來自規則expr
→ array_elem
→ expr
間接左遞歸。 解決您特定語法中此問題的最簡單方法是將array_elem
規則內聯到expr
規則中,並使用帶標簽的外部替代項為expr
每個替代項分配有意義的名稱。
expr
: int_liter # someLabel
| bool_liter # someLabel
| char_liter # someLabel
| str_liter # someLabel
| pair_liter # someLabel
| ident # someLabel
| expr OPEN_BRACKET expr CLOSE_BRACKET # array_elem
| unary_oper expr # someLabel
| expr binary_oper expr # someLabel
| OPEN_PARENTHESES expr CLOSE_PARENTHESES # someLabel
;
請注意以下有關使用標記的外部替代項的約束:
array_elem
替代項),則必須標記該規則的所有外部替代項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.