Вопрос

У меня сейчас довольно проблема с 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: он должен начать с двух чисел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top