Грамматика Antlr4 с базовой арифметикой и выражениями со знаком

Я учу Antlr4 писать язык для базовой арифметики. В настоящее время я написал грамматику с Antlr4 для основных арифметических операторов * + - /. Вот моя грамматика:

grammar Expr; // rename to distinguish from Expr.g4

prog:   stat (';' stat)* ;

stat:   ID '=' expr (';'|',')?              # assign
    |   expr (';')?                         # printExpr
    ;

expr:   op=('-'|'+') expr                    # signed
    |   expr op=('*'|'/') expr               # MulDiv
    |   expr op=('+'|'-') expr               # AddSub
    |   ID                                   # id                 
    |   DOUBLE                               # Double
    |   '(' expr ')'                         # parens
    ;



MUL :   '*' ; // assigns token name to '*' used above in grammar
DIV :   '/' ;
ADD :   '+' ;
SUB :   '-' ;
ID  :   [a-zA-Z]+ [0-9]* ;      // match identifiers
DOUBLE :   [0-9]+ ('.' [0-9]+)? ;
WS : [ \t\r\n]+ -> skip ;

Проблема в том, что моя грамматика принимает ввод типа 2++++3 из-за правила: op=('-'|'+') expr. Однако я не нашел другого способа реализовать знаковые выражения, такие как -2 + 3, x = 6; y = -x, +3 -2.

Как я могу исправить ошибку?


person BlackMassiv    schedule 07.11.2014    source источник


Ответы (1)


Попробуйте разбить свою грамматику, теперь это немного чудовищное правило (expr). Вероятно, вы хотите подписать не целое выражение, а одно значение. Как насчет чего-то подобного

expr: add value
    | expr mult expr
    | expr add expr
    | value
    ;
value: ID
     | DOUBLE
     | '(' expr ')'
     ;
add: '+' | '-';
mult: '*' | '/';

Таким образом, вы можете создавать знаковые выражения, такие как -2, +x или -(2+3), но не 2++3.

person Mephy    schedule 07.11.2014