我有以下表达式组,其中所有内容都抛出到相同的expr规则中:
grammar MyGrammar;
expr
: '(' expr ')'
// BoolExressions -- cannot move these out or else get Left-Recursion
| expr ('=' | '!=') expr
| expr 'AND' expr
| expr 'OR' expr
| ATOM
;
ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;它可以工作,但是我想提取boolExpression内容,这样我就可以单独使用它,因为我所拥有的其他规则必须使用布尔表达式而不是任何表达式。然而,一旦我这样做,我就会得到一个左递归错误。
有什么好方法来解决这个问题,这样我就可以将BooleanExpression分离开来了?理想情况下,我希望它“看起来像这样”:
grammar MyGrammar;
expr
: '(' expr ')'
| boolExpr
| ATOM
;
boolExpr
: expr ('=' | '!=') expr
| expr 'AND' expr
| expr 'OR' expr
;
ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;
// error(119): The following sets of rules are
// mutually left-recursive [expr, boolExpr]发布于 2022-08-20 11:23:24
它并不能给您提供一个boolExpr,但是您应该考虑使用标记的替代方案:
grammar MyGrammar;
expr
: '(' expr ')'
// BoolExressions -- cannot move these out or else get Left-Recursion
| expr ('=' | '!=') expr # compareExpr
| expr 'AND' expr # andExpr
| expr 'OR' expr # orExpr
| ATOM
;
ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;这会为每个选项创建单独的*上下文类,这大大降低了您的侦听器和访问者所处理的上下文的复杂性(显然会有更多的上下文)。符号的作用域也适用于每一种选择,这样您就可以执行如下操作:
grammar MyGrammar;
expr
: '(' expr ')'
// BoolExressions -- cannot move these out or else get Left-Recursion
| lhs=expr ('=' | '!=') rhs=expr # compareExpr
| lhs=expr 'AND' rhs=expr # andExpr
| lhs=expr 'OR' rhs=expr # orExpr
| ATOM
;
ATOM: [a-z]+ | [0-9]+;
WHITESPACE: [ \t\r\n] -> skip;https://stackoverflow.com/questions/73424355
复制相似问题