我的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 : [ trn] -> skip ;

我尝试插入sin(-1),但是词法分析器告诉我"在输入'-'时没有可行的替代"。

我认为程序翻译" exp -> exp (OP exp) + "而不是" exp -> 有趣(num) -> 有趣(num) "

有没有人能帮我明白我忘记了什么,如何以正确的方式改变我的规则?由于

首先我要简化num和fun的规则

num : INT 
    | INT 'b'
    | '0x' INT 
    ;
fun : FUN_TXT LPAREN exp RPAREN
    | 'pow' LPAREN exp ',' exp RPAREN
    ;

括号和减号由exp规则处理。

您还需要将ADD和SUB从乘法操作符中分离出来,以获得正确的优先级。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
    ;

我倾向于从这个开始。

相关内容

  • 没有找到相关文章

最新更新