我正在尝试使用AND
和OR
描述简单语法,但失败并出现以下错误
以下几组规则是相互左递归的
语法如下:
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' | '&';
编译。
为什么?
答案 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