2015-09-25 17 views
1

у меня есть эта грамматикаМой Antlr4 Грамматика не понимает математические выражения

grammar Arith; 

exp : LPAREN exp RPAREN 
    | fun 
    | num 
    | exp (OP exp)+ 
    ; 

num : LPAREN num RPAREN 
    | LESS num 
    | INT 
    | INT 'b' 
    | '0x' INT 
    ; 

fun : LPAREN fun RPAREN 
    | LESS fun 
    | FUN_TXT LPAREN exp RPAREN 
    | 'pow' LPAREN exp ',' exp RPAREN 
    ; 

INT : ('0'..'9')+ ; 

LPAREN : '(' ; 
RPAREN : ')' ; 

FUN_TXT : 'log' | 'acos' | 'asin' | 'atan' | 'cos' | 'abs' | 'sin' | 'sqrt' | 'tan' ; 

OP : ADD | LESS | MUL | DIV | MOD ; 

ADD : '+' ; 
LESS : '-' ; 
MUL : '*' ; 
DIV: '/' ; 
MOD: '%' ; 
WS : [ \t\r\n] -> skip ; 

Я пытаюсь вставить грех (-1) но лексер сказал мне «нет реальной альтернативы на входе„-“».

Я думаю, что программа перевести его в "ехре ->ехра (OP ехре) +" вместо "ехра ->забавных (NUM) ->весело (МЕНЬШЕ Num)"

Может кто-нибудь помочь мне понять, что я забыл, и как правильно изменить мои правила? Благодаря

ответ

1

Во-первых, я бы упростить правила для NUM и весело

num : INT 
    | INT 'b' 
    | '0x' INT 
    ; 

fun : FUN_TXT LPAREN exp RPAREN 
    | 'pow' LPAREN exp ',' exp RPAREN 
    ; 

Кронштейны и минусы обрабатываются по правилу ехр.

Вам также необходимо отделить ADD и SUB от мультипликативных операторов, чтобы получить приоритет справа. calculator пример для грамматик Antlr использует

expression 
    : multiplyingExpression ((PLUS|MINUS) multiplyingExpression)* 
    ; 

multiplyingExpression 
    : powExpression ((TIMES|DIV) powExpression)* 
    ; 

powExpression 
    : atom (POW expression)? 
    ; 

atom 
    : scientific 
    | variable 
    | LPAREN expression RPAREN 
    | func 
    ; 

scientific 
    : number (E number)? 
    ; 

func 
    : funcname LPAREN expression RPAREN 
    ; 

я был бы склонен исходить из этого.

+0

Я раньше не видел этот пример, это прекрасно. благодаря – Tirrel

Смежные вопросы