ANTLR4 Грамматика оставлена рекурсивная ошибка
Вопрос
У меня сейчас довольно проблема с ANTLR4.
Всякий раз, когда я пытаюсь кормить Antlr с этой грамматикой RPN
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
plus : expression expression '+';
minus : expression expression '-';
mult : expression expression '*';
div : expression expression '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
antlr бросит ошибку, потому что плюс, минус, mult и div, взаимно левый рекурсивный.
Я не знаю, как это исправить.
(Я знаю, что это происходит, потому что с этой грамматикой «выражение» может быть бесконечно петли, у меня была эта проблема раньше с другой грамматикой, но я мог бы исправить это самостоятельно)
Мое единственное решение было бы ограничить грамматику следующим образом
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER NUMBER '-';
mult2: NUMBER NUMBER '*';
div2: NUMBER NUMBER '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
Но это не совсем то, что я хочу, потому что теперь я мог бы работать максимум с выражениями, такими как
2 3 + 5 4 - *
.
и грамматика будет более сложным, чем на самом деле может быть.
Надеюсь, вы, ребята, можете помочь мне
Решение
antlr4 поддерживает только «прямые» левые рекурсивные правила, а не «косвенные», как у вас их.
попробуйте что-то вроде этого:
grammar RPN;
parse : expression EOF;
expression
: expression expression '+'
| expression expression '-'
| expression expression '*'
| expression expression '/'
| NUMBER
;
NUMBER : '-'? ('0'..'9')+;
SPACES : [ \t\r\n] -> skip;
.
btw, 23+54-*
не является действительным выражением RPN: он должен начать с двух чисел.