2
我有一个expression
这是我的其他顶级事物的集合。在expression
我有math
即expression (op) expression
。有了这个,我得到什么时候/为什么相互左递归在Antlr中发生?
规则的以下几组相互左递归[表达,数学]
compileUnit : expression EOF;
expression
: parens
| operation
| math
| variable
| number
| comparisonGroup
;
math : expression op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression #mathExpression;
无论其!
这是不是一个problem-
expression
: parens
| operation
| expression op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression
| variable
| number
| comparisonGroup
;
而且这也不是 - !
math : op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression expression #mathExpression;
那么,为什么我的第一个代码块的行为比其他两个例子不同?
第一个例子没有显示直接左递归 - 这也会是一个问题吗?我没有TDAR,但我可能必须得到它。 –
Antlr4可以处理直递左递归,其中递归“在左边调用*本身*”。数学规则创建了一个间接的左递归,因为它在左边引用了* another *规则。强烈推荐TDAR。 – GRosenberg
刚刚看过https://youtu.be/q8p1voEiu8Q?t=38m32s。现在,我确定“这就是它”。希望在阅读TDAR之后,我将更好地理解*如何*一切正常,而不仅仅是*一切正常。 谢谢。 –