gpt4 book ai didi

antlr4 - 对于 +、-、/、* 等的正确优先级评估,正确的语法应该是什么

转载 作者:行者123 更新时间:2023-12-03 14:12:06 24 4
gpt4 key购买 nike

我的语法有这些规则

 expression
: expression EQ conditionalOrExpression #eqExpr
| expression NEQ conditionalOrExpression #neqExpr
| expression LT conditionalOrExpression #ltExpr
| expression GT conditionalOrExpression #gtExpr
| expression LTEQ conditionalOrExpression #lteqExpr
| expression GTEQ conditionalOrExpression #gteqExpr
| conditionalOrExpression #next
;

conditionalOrExpression
: conditionalOrExpression OR conditionalAndExpression #orExpr
| conditionalAndExpression #and
;

conditionalAndExpression
: conditionalAndExpression AND additiveExpression #andExpr
| additiveExpression #add
;

additiveExpression
: additiveExpression PLUS multiplicativeExpression #plusExpr
| additiveExpression MINUS multiplicativeExpression #minusExpr
| multiplicativeExpression #multiplicative
;

multiplicativeExpression
: multiplicativeExpression MULT unaryExpression #multExpr
| multiplicativeExpression DIV unaryExpression #divExpr
| unaryExpression #unary
;

unaryExpression
: MINUS unaryExpression #unaryMinusExpr
| NOT unaryExpression #notExpr
| atom #atomExpr
;

function
: ID OPAR (parameter (',' parameter)*)? CPAR
;

parameter
: STRING #stringParameter
| expression #exprParameter
;

atom
: OPAR expression CPAR #parExpr
| (INT | FLOAT) #numberAtom
| (TRUE | FALSE) #booleanAtom
| ID #idAtom
| function #functionAtom
;

我已经实现了适当的访问者。

如果我评估“40 + 10 - (2*40) + (100/40) + 0.2”,结果是-32.7。这是因为表达式被评估为
(40+10) - (((2*40) + (100/40)) + 0.2) 

根据规则(在减号之前加号)这是有道理的。

但是,如果我在 Excel 或 e.g. 中评估相同的表达式将它分配给 C# 中的 double 值,在这两种情况下,结果都是 -27.3。这是因为他们将规则评估为
(((40+10)-(2*40)) + (100/40)) + 0.2

那么哪个是“正确的”? -32.7 在技术上是正确的,因为这是规则规定的。但是应该如何更改语法以匹配 Excel/C# 中的结果?

最佳答案

如果您将 + 分组和 -在一个单一的选择,它应该工作。我在 my demo evaluator on GitHub 中更改了语法如下:

expr
: expr POW<assoc=right> expr #powExpr
| MINUS expr #unaryMinusExpr
| NOT expr #notExpr
| expr op=(MULT | DIV | MOD) expr #multiplicationExpr
| expr op=(PLUS | MINUS) expr #additiveExpr
| expr op=(LTEQ | GTEQ | LT | GT) expr #relationalExpr
| expr op=(EQ | NEQ) expr #equalityExpr
| expr AND expr #andExpr
| expr OR expr #orExpr
| atom #atomExpr
;

然后使用以下代码进行测试:
MuLexer lexer = new MuLexer(new ANTLRInputStream("log(40 + 10 - (2*40) + (100/40) + 0.2);"));
MuParser parser = new MuParser(new CommonTokenStream(lexer));
new EvalVisitor().visit(parser.parse());

-27.3打印在我的控制台上。

关于antlr4 - 对于 +、-、/、* 等的正确优先级评估,正确的语法应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25413460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com