expr
和condition
给了我这个错误,似乎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;
答案 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优先级较低。而且由于该规则在右侧也是递归的,因此您无需在此处循环。