以下规则集在ANTLR中相互左递归

时间:2018-09-23 02:36:40

标签: antlr4

exprcondition给了我这个错误,似乎antlr认为它就像是可能的无限递归循环。我该如何避免呢?

query : relationName '<-' expr;

relationName : identifier ;

identifier : (LETTER | IDENTIFIER1 | IDENTIFIER2)+;

expr : atomicExpr
       | selection
       | projection 
       | renaming
       | union
       | difference
       | product
       | naturalJoin;

atomicExpr : relationName | expr;

selection : 'select' (condition) atomicExpr;

condition : conjunction ('||' conjunction)*;

conjunction : comparison ('&&' comparison)*;

comparison : operand op operand | condition;

1 个答案:

答案 0 :(得分:2)

规则expr是间接左递归的,因为它包含atomicExpr,该规则在左侧也使用expr。但是,atomicExpr是一个非常无用的规则。通过定义:

expr : relationName
       | selection
       | projection 
       | renaming
       | union
       | difference
       | product
       | naturalJoin;
selection : 'select' (condition) expr;

您将获得完全相同的语法,但是没有这种递归。

condition有点困难,因为左递归涉及3条规则(condition在左侧使用conjunction,在左侧使用comparison,而在{{ 1}})。您可以通过将单独的规则合并为一个来解决该问题:

condition

优先级由选择的顺序来确保。以后的alt优先级较低。而且由于该规则在右侧也是递归的,因此您无需在此处循环。