我有一个expression
,它是我的其他顶级事物的集合。在expression
中,有math
,也就是expression (op) expression
。我得到
下列规则集是相互左递归的[expression, math]
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;
那么为什么我的第一个代码块的行为与其他两个例子不同呢?
Antlr4可以处理直接左递归,但不能处理间接左递归,其中左递归规则定义为"直接或间接在替代的左边缘调用自身"的规则(TDAR;pg 71)。
与第一个示例中一样,当#mathExpression
选项从expression
规则中分离出来并进入单独的math
规则时,左直接递归变为间接递归,即。,规则是'相互左递归'。