我很惭愧地问...... 我用语法编写了一个语法语法,从int到bool,反之亦然。
logic_expr : expr NOT? OR | AND expr
| expr '|' expr SMALLER | LARGER
| NUMBER
| NUMBER_SHORT
| IDENT
| LOGIC_DEFINED
;
math_expr : expr ADD | SUB expr
| NUMBER
| NUMBER_SHORT
| IDENT
| LOGIC_FULL
;
expr : logic_expr
| math_expr
| IDENT
| LOGIC_DEFINED
| '(' expr ')'
;
但是antlr告诉我“以下几组规则是相互左递归的[logic_expr,expr,math_expr]” 我不明白我的语法有什么问题?
答案 0 :(得分:4)
从ANTLR 4.2.2开始,ANTLR 4目前不支持包含间接左递归的语法。 issue #522解决了这一限制,我希望将其纳入ANTLR 4.3。
由于ANTLR 4已经支持直接左递归,因此您可以通过内联logic_expr
和math_expr
规则来解决此问题。我还通过添加您省略的括号编辑了3个破损的备选方案。我没有消除原规则中存在的含糊之处。
expr
: expr NOT? (OR | AND) expr
| expr '|' expr (SMALLER | LARGER)
| NUMBER
| NUMBER_SHORT
| IDENT
| LOGIC_DEFINED
| expr (ADD | SUB) expr
| NUMBER
| NUMBER_SHORT
| IDENT
| LOGIC_FULL
| IDENT
| LOGIC_DEFINED
| '(' expr ')'
;