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
替代项),则必须标记该规则的所有外部替代项。