3

我很惭愧地问...我为从 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]”我无法理解我的语法有什么问题?

4

1 回答 1

4

从 ANTLR 4.2.2 开始,ANTLR 4 目前不支持包含间接左递归的语法。这个限制已通过issue #522得到解决,我希望它能够进入 ANTLR 4.3。

由于 ANTLR 4 已经支持直接logic_expr左递归,你可以通过内联你的andmath_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 ')'
       ;
于 2014-04-10T21:17:06.050 回答