2015-09-25 29 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)但詞法說我「在輸入任何可行的替代‘ - ’」。

我認爲程序翻譯爲 「EXP - >EXP(OP EXP)+」 而不是 「EXP - >樂趣(NUM) - >樂趣(LESS NUM)

有人能幫助我理解我忘記了什麼,以及如何以正確的方式改變我的規則? 感謝

回答

1

首先,我將簡化您的NUM的規則和樂趣

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

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

支架和短處是由EXP規則處理。

您還需要將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