ANTLR4 еще одна левая рекурсия

Мне очень стыдно спрашивать... Я написал грамматику для языка с приведением типов от 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]». Я не могу понять, что не так в моей грамматике?


person Diogen737    schedule 10.04.2014    source источник
comment
Возможно, это поможет: youtube.com/watch?v=8JdjkshB7FI   -  person ZhekaKozlov    schedule 11.04.2014


Ответы (1)


Начиная с ANTLR 4.2.2, ANTLR 4 в настоящее время не поддерживает грамматики, содержащие непрямую левую рекурсию. Это ограничение устраняется проблемой № 522, которая, я надеюсь, войдет в ANTLR 4.3. .

Поскольку ANTLR 4 уже поддерживает прямую левую рекурсию, вы можете решить эту проблему, встроив правила logic_expr и math_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 ')'
       ;
person Sam Harwell    schedule 10.04.2014