当前位置: 首页 > 知识库问答 >
问题:

我的Antlr4语法不懂数学表达式

景俊拔
2023-03-14
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个答案

宋俊民
2023-03-14

首先,我将简化您的规则,以获得num和乐趣

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
    ;
 类似资料:
  • 所以我已经用antlr4语法写了我的语法。然后我设置代码生成,现在我可以用自己定义的语言解析源文件。这很管用! 我采取的下一步是从表达式树创建对象模型。这也很管用。 我使用的是最新的ANTLR4:antlr 4.7.1。

  • 由于问题不清楚,我先前的问题被搁置。 用特定查询再次过帐 我的要求是使用PHP解决任何数学复杂表达式。例如, 如果我有一个字符串“1(12)/34”,使用BODMAS规则,我必须求解它。但我也必须得到所有单独的步骤。 我提到的两个网站是: http://www.careerbless.com/calculators/ScientificCalculator/ http://web2.0calc.c

  • 我有以下ANTLR4语法 除此之外还有一个问题:- 对于上面的场景,ANTLR没有抛出错误,表达式不应该是(Var1)(Var2)--它应该总是包含操作符(Var1)*(Var2)或(Var1)+(Var2)等。解析器错误树没有生成此错误。如何修改语法以确保即使是这种情况也被考虑在内。

  • Matplotlib 中的文本字符串都可以使用 Text Markup(一种文本标记语言)显现出来,具体的使用方法是将文本标记符放在一对美元符号 内,语法格式如下: 如果要绘制下标和上标,您需要使用 和 符号,下面是一个简单的示例: 上面代码的输出结果: Matplotlib数学表达式绘制 从上述示例可以看出,虽然数学表达式种类繁多,但是 Matplotlib 对各种数学符号都做了良好的支持。

  • 表达式会通过parser生成抽象语法树。Native提供了解析引擎可以解析这个语法树,并计算出结果。 目前parser支持两大类功能: 基本四则运算、逻辑运算符、比较运算符 函数(如大部分的math函数、动画插值器函数、一些工具函数等) 下面是具体支持的情况: 运算符 + >= - <= * == - === () != % !== ** && > || < ! ?: Math函数 sin sqr