何时/为什么在Antlr中发生相互左递归?

时间:2016-09-30 01:36:53

标签: recursion antlr antlr4

我有expression这是我其他顶级事物的集合。在expressionmath 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;

那么为什么我的第一个代码块的行为与其他两个示例的行为不同呢?

1 个答案:

答案 0 :(得分:3)

Antlr4可以处理直接左递归,但不能处理间接左递归,其中左递归规则被定义为“直接或间接地在替代的左边缘调用自身”的规则(TDAR;第71页)。 / p>

与第一个示例中一样,#mathExpression替换是expression规则中的事件和单独的math规则,左直接递归变为间接递归,,规则是“相互左递归”。

正如在第二个和第三个例子中所实现的,一个典型的解决方案是简单地将间接左递归规则组合在一个规则中。