Antlr4:以下几组规则是相互左递归的

时间:2016-12-07 12:49:48

标签: recursion antlr4

我正在尝试使用ANDOR描述简单语法,但失败并出现以下错误

以下几组规则是相互左递归的

语法如下:

expr:
    NAME |
    and |
    or;

and:
    expr AND expr;

or:
    expr OR expr;

NAME : 'A' .. 'B' + ;
OR: 'OR' | '|';
AND: 'AND' | '&';

同时,以下语法

expr:
    NAME |
    expr AND expr |
    expr OR expr;

NAME : 'A' .. 'B' + ;
OR: 'OR' | '|';
AND: 'AND' | '&';

编译。

为什么?

2 个答案:

答案 0 :(得分:2)

ANTLR4仅支持直接左递归(这已经比以前的版本有所改进)。这意味着您可以在单个规则中保留递归,但不能通过多个规则(例如,规则a使用规则b,它使用a作为备选方案中的第一个规则。

答案 1 :(得分:1)

如前所述:ANTLR4仅支持直接左递归。您可以标记替代方案,以便在您生成的访问者或听众中产生干扰:

expr
 : NAME           #NameExpr
 | expr AND expr  #AndExpr
 | expr OR expr   #OrExpr
 ;

NAME : 'A' .. 'B' + ;
OR   : 'OR' | '|';
AND  : 'AND' | '&';

请注意,'A'..'Z'+是旧的v3语法,在第4版中,您可以执行此操作:[A-Z]+

请参阅:https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md#alternative-labels