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 ; 

введите описание здесь

Другие вопросы по тегам