我的Antlr4语法并不理解数学表达式

时间:2015-09-25 14:03:16

标签: antlr grammar antlr4 lexer

我有这个语法

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 ;

我尝试插入 sin(-1)但是lexer说我"在输入时没有可行的选择' - '"。#/ p >

我认为该计划将其转换为" exp - > exp(OP exp)+ "代替" exp - > 有趣(num) - > 有趣(少数)"

有人可以帮我理解我已经忘记了什么,以及如何以正确的方式改变我的规则? 感谢

1 个答案:

答案 0 :(得分:1)

首先,我会简化你的数量和乐趣的规则

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

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

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

您还需要将ADD和SUB与乘法运算符分开才能获得优先权。 Antlr语法的calculator示例使用

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
    ;

我倾向于从那开始。