Следующие наборы правил взаимно леворекурсивны в ANTLR - PullRequest
0 голосов
/ 23 сентября 2018

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;

1 Ответ

0 голосов
/ 23 сентября 2018

Правило expr является косвенной левой рекурсивной, поскольку оно содержит atomicExpr, которое также использует expr в левой части.Однако atomicExpr - довольно бесполезное правило.Определив:

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

, вы получите точно такой же синтаксис, но без этой рекурсии.

condition немного сложнее, поскольку левая рекурсия включает 3 правила (conditionиспользует conjunction слева, который использует comparison, который снова использует condition).Вы можете решить это, объединив отдельные правила в одно:

condition:
    comparison
    | condition LOGICAL_AND condition
    | condition LOGICAL_OR condition
;
comparison: operand (op operand)?

LOGICAL_OR: '||';
LOGICAL_AND: '&&';

Приоритет обеспечивается порядком альтернатив.Более поздние альты имеют меньший приоритет.А так как это правило рекурсивно и с правой стороны, вам здесь не нужны циклы.

...