【问题标题】:The following sets of rules are mutually left-recursive in ANTLR以下规则集在 ANTLR 中是相互左递归的
【发布时间】:2019-02-26 23:18:27
【问题描述】:

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;

【问题讨论】:

    标签: antlr4


    【解决方案1】:

    规则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: '&&';
    

    优先级由备选方案的顺序确保。后面的 alt 具有较小的优先级。由于这条规则在右手边也是递归的,所以这里不需要循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多