Boolean and Math Expression Parser
我正在编写一个允许用户输入布尔表达式的应用程序。我需要能够在运行时评估输入的布尔表达式,并同时寻找解析器和表达式点验证器。
语法分析器
分析器需要将布尔表达式作为字符串,并返回true/false。
例子:
1 2 3 | string expression ="(1 == 1) && (1 > 0)"; Parser parser = new Parser(); boolean result = parser.parse(expression); // Result should be True. |
除了处理布尔表达式之外,我还需要它来处理数学。
1 2 | expression ="((1 + 1 * 2) == 1)"; result = parser.parse(expression); // Result should be False. |
验证< BR>为了告诉用户输入的表达式是否有问题,我还需要一种方法来验证语法。
我正在使用.NET Compact框架在C语言中工作,但如果您知道用其他语言编写的内容,可能会有所帮助。
感谢您提供的帮助。汤姆
我们的项目使用NCALC(下面有ANTLR用于词法分析),我们对此非常满意。
NCalc is a mathematical expressions
evaluator in .NET. NCalc can parse any
expression and evaluate the result,
including static or dynamic parameters
and custom functions.
我们的应用程序要求它针对完整和紧凑的框架进行交叉编译。通过相对简单的调整,我们能够使NCALC和ANTLR同时适用于两种框架风格。
网址:http://www.antlr.org
ANTLR语法可以设计为同时允许解析和评估。
例如:http://www.antlr.org/wiki/display/antlr3/expression+evaluator
假设您可以稍微更改语法,那么让一个嵌入的数据库使用类似于T-SQL的查询来完成这项工作:
1 | select case when <Expression> then 1 else 0 end as Result |
使用您的示例:
1 2 | select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result |
这种类型的东西是F’s面包和黄油。你可以试试看。对于解析,使用递归下降,然后可以在结果树上运行。如果您对输入语言有控制权,则可以通过引号操作来完成。
这里有一个优秀的代码项目评估解析器,它使用eval方法,不依赖codedom或类似的东西。这里有一篇关于使用antlr构建表达式评估器的优秀文章,同样也在同一个站点上。
希望这有帮助,最好的问候,汤姆。
您可以使用dotmash库来执行此操作。
我不知道有什么图书馆能让这变得更容易,但这里有两个子问题。您需要构建一个infix-to-postfix转换器,然后为布尔和数学运算编写一个基本的计算器。
一旦构建了布尔树/堆栈,就开始执行操作。如果您有任何不是数字的东西,请通过将字符串/表达式发送到算术计算器(算术计算器执行infix->postfix转换)来计算它,然后返回一个值。
如果你搜索"infix to postfix"和"stack rpn calculator",你可能会找到更多的资源。