关于.net:布尔和数学表达式解析器

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",你可能会找到更多的资源。