2016-12-07 56 views
0

我想要的记号来描述简单的语法与ANDOR,但失败并出现以下错误Antlr4:规则的以下几组相互左递归

的规则下集是相互左递归

语法是以下:

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' | '&'; 

确实编译。

为什么?

回答

1

ANTLR4仅支持直接左递归(这已经比以前的版本有所改进)。这意味着你可以在一个单一的规则已经离开了递归,但不能在多个规则(例如规则a使用规则b它采用a作为一种替代的第一条规则

+0

但我需要为每个操作都有合适的节点,比如分析树中的AND和OR。如果有一条规则会解析所有这些规则,这是如何实现的? – Dims

+0

你可以通过查看现有的语法学到很多东西(例如https://github.com/antlr/grammars-v4)。您可以定义您的规则,以便将左递归部分最终放入单个规则中,或者可以以非递归方式进行操作。 –

0

前面已经提到:ANTLR4只支持直接左递归。你可以标记方案做出distiction在生成的访问者或听众:

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

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

注意'A'..'Z'+是老V3的语法,在V4你可以这样做:[A-Z]+

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