我有一些相互左递归的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 ;
有关如何解决此问题的任何想法?
答案 0 :(得分:1)
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
替代方案),则必须标记该规则的所有外部替代方案。