【问题标题】:Antlr4: The following sets of rules are mutually left-recursiveAntlr4:以下几组规则是相互左递归的
【发布时间】:2016-12-07 12:49:48
【问题描述】:

我试图用ANDOR 描述简单的语法,但失败并出现以下错误

以下规则集是相互左递归的

语法如下:

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

编译。

为什么?

【问题讨论】:

    标签: recursion antlr4


    【解决方案1】:

    如前所述:ANTLR4 仅支持直接左递归。您可以标记替代方案以在生成的访问者或听众中做出区分:

    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

    【讨论】:

      【解决方案2】:

      ANTLR4 仅支持 direct 左递归(这已经是对以前版本的改进)。这意味着您可以在单个规则中保留递归,但不能在多个规则中使用(例如,规则 a 使用规则 b,它使用 a 作为替代方案中的第一条规则。

      【讨论】:

      • 但我需要为解析树中的每个操作(如 AND 和 OR)设置适当的节点。如果一个规则可以解析所有这些,这怎么可能?
      • 你可以通过查看现有的语法学到很多东西(例如github.com/antlr/grammars-v4)。你可以定义你的规则,让左递归部分最终成为一个规则,或者你可以用非递归的方式来做。
      • @MikeLischke 很难挖掘这么多语法。你能提供一个例子来说明如何使用非递归方式解决这个问题吗?
      【解决方案3】:

      我知道这是在很长一段时间之后...但是您的第二个语法可以编译,因为您没有正确括起来的替代方案。所以

      expr: NAME |
          expr AND expr |
          expr OR expr ;
      

      实际上被 Antlr 理解为:

      expr: (NAME | expr) AND (expr | expr) OR expr ;
      

      以下规则实际上不会编译:

      expr:
          NAME |
          (expr AND expr) |
          (expr OR expr) ;
      

      【讨论】:

      • 是的,事实上任何顶级“替代”规则,最左边的符号用 +/*/?/() 操作符修改将导致 Antlr 不重构规则以删除递归.例如,e: N | (e) AND e | e OR e;e: N | (e AND e) | e OR e;e: e? 'a-postfix-op';e: e* | N; 都将被标记。 Antlr(以及我自己的重构语法的工具)寻找一个非常具体的规则解析树。如果它与 Aho/Sethi/Ulman p176 中概述的模式不完全匹配,则不会重构规则,递归仍然存在,并且间接左递归检查将标记问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多