2015-09-25 49 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