【问题标题】:ANTLR4 yet another left recursionANTLR4 又一个左递归
【发布时间】:2014-04-10 21:07:54
【问题描述】:

我很惭愧地问... 我为该语言编写了一个语法,类型转换从 int 到 bool,反之亦然。

logic_expr : expr NOT? OR | AND expr
       | expr '|' expr SMALLER | LARGER
       | NUMBER
       | NUMBER_SHORT
       | IDENT
       | LOGIC_DEFINED
       ;
math_expr : expr ADD | SUB expr
      | NUMBER
      | NUMBER_SHORT
      | IDENT
      | LOGIC_FULL
      ;
expr : logic_expr
     | math_expr
     | IDENT
     | LOGIC_DEFINED
     | '(' expr ')'
     ;

但 antlr 告诉我“以下规则集是相互左递归的 [logic_expr, expr, math_expr]” 我无法理解我的语法有什么问题?

【问题讨论】:

标签: antlr4 left-recursion


【解决方案1】:

从 ANTLR 4.2.2 开始,ANTLR 4 目前不支持包含间接左递归的语法。 issue #522 解决了这个限制,我希望它能在 ANTLR 4.3 中实现。

由于 ANTLR 4 已经支持直接左递归,您可以通过内联logic_exprmath_expr 规则来解决这个问题。我还通过添加您省略的括号来编辑 3 个损坏的替代方案。我没有消除原始规则中存在的歧义。

expr
       : expr NOT? (OR | AND) expr
       | expr '|' expr (SMALLER | LARGER)
       | NUMBER
       | NUMBER_SHORT
       | IDENT
       | LOGIC_DEFINED
       | expr (ADD | SUB) expr
       | NUMBER
       | NUMBER_SHORT
       | IDENT
       | LOGIC_FULL
       | IDENT
       | LOGIC_DEFINED
       | '(' expr ')'
       ;

【讨论】:

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