我有expression
这是我其他顶级事物的集合。在expression
我math
expression (op) expression
。有了这个,我得到了
以下几组规则是相互左递归的[表达式,数学]
compileUnit : expression EOF;
expression
: parens
| operation
| math
| variable
| number
| comparisonGroup
;
math : expression op=( ADD | SUBSTRACT | MULTIPLY | DIVIDE ) expression #mathExpression;
无论其!
这不是问题 -
expression
: parens
| operation
| expression op=( ADD | SUBSTRACT | MULTIPLY | DIVIDE ) expression
| variable
| number
| comparisonGroup
;
这也不是! -
math : op=( ADD | SUBSTRACT | MULTIPLY | DIVIDE ) expression expression #mathExpression;
那么为什么我的第一个代码块的行为与其他两个示例的行为不同呢?
答案 0 :(得分:3)
Antlr4可以处理直接左递归,但不能处理间接左递归,其中左递归规则被定义为“直接或间接地在替代的左边缘调用自身”的规则(TDAR;第71页)。 / p>
与第一个示例中一样,#mathExpression
替换是expression
规则中的事件和单独的math
规则,左直接递归变为间接递归,即,规则是“相互左递归”。
正如在第二个和第三个例子中所实现的,一个典型的解决方案是简单地将间接左递归规则组合在一个规则中。