Intellij Antlr4 Plugin Левая прямая рекурсия не работает
Я пытаюсь сделать парсер, используя Antlr4 для оператора выбора SQL, в котором содержится следующая часть
expr: '1' | expr('*'|'/'|'+'|'-'|'||') expr; // As the re-factored form of expression: compound expression;
WS :[ \t\r\n]+ -> skip ;
Я предполагаю, что это правило позволит следующие наборы результатов:
1
1+1
1+1-1
....
Но на графике видно, что его невозможно разобрать
Кто-нибудь понимает, почему он не может быть проанализирован так, как я ожидал?
1 ответ
Решение
Эта немного скорректированная грамматика работает для меня. Проверено на входе 1+1-1||1*1-1/1
, Протестировано в ANTLRWorks2.1
grammar myGrammar;
top : expr EOF ;
expr : '1'
| expr '+' expr
| expr '*' expr
| expr '/' expr
| expr '+' expr
| expr '-' expr
| expr '||' expr
;
WS :[ \t\r\n]+ -> skip ;
One : '1' ;
Times : '*' ;
Div : '/' ;
Plus : '+' ;
Minus : '-' ;
Or : '||' ;
РЕДАКТИРОВАТЬ
Я смог заставить это работать тоже, когда соответствует правилу top
:
grammar newEmptyCombinedGrammar;
top : expr EOF ;
expr: one
| expr op=(Times|Div|Plus|Minus|Or) expr
;
one : One ;
One : '1' ;
Times : '*' ;
Div : '/' ;
Plus : '+' ;
Minus : '-' ;
Or : '||' ;
WS :[ \t\r\n]+ -> skip ;