我正在编写一个允许用户输入布尔表达式的应用程序 . 我需要能够在运行时评估输入的布尔表达式,并且正在寻找解析器和expressoin验证器 .
Parser
解析器需要将布尔表达式作为字符串并返回true / false .
例:
string expression = "(1 == 1) && (1 > 0)";
Parser parser = new Parser();
boolean result = parser.parse(expression); // Result should be True.
除了处理布尔表达式之外,我还需要它来处理数学 .
expression = "((1 + 1 * 2) == 1)";
result = parser.parse(expression); // Result should be False.
Validate
这样我就可以告诉用户输入的表达式是否有问题我还需要一种方法来验证语法 .
我使用.NET Compact Framework在C#中工作,但如果您知道用其他语言编写的内容可能会有所帮助 .
感谢您的任何帮助,您可以提供 . 汤姆
7 回答
http://www.antlr.org
Antlr语法可以设计为允许解析和评估 .
这是一个例子:http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator
我们的项目正在使用NCalc(下面有ANTLR用于lexing / parsing),我们对它非常满意 .
我们的应用程序要求对完整框架和紧凑框架进行交叉编译 . 通过相对简单的调整,我们能够使NCalc和ANTLR都适用于两种框架风格 .
假设您可以稍微更改语法,让嵌入式数据库通过类似此T-SQL的查询为您完成工作:
使用你的例子:
我不知道有任何库可以让这更容易,但你真的只有两个子问题 . 您需要构建一个中缀到postfix转换器,然后为布尔和数学运算编写一个基本计算器 .
一旦构建了布尔树/堆栈,就开始执行操作 . 如果你有任何不是数字的东西,可以通过将字符串/表达式发送到算术计算器来进行评估,该计算器执行infix-> postfix转换,然后返回一个值 .
如果你谷歌“中缀到postfix”和“堆栈rpn计算器”,你可能会找到更多的资源 .
您可以使用dotMath库来执行此操作 .
这是Codeproject上的一个优秀的评估解析器,它使用eval方法,不依赖于CodeDOM或类似的东西 . 这是一篇关于使用Antlr构建expression evaluator的优秀文章,也在同一网站上 .
希望这会有所帮助,最好的问候,汤姆 .
这种东西是F#的面包和黄油 . 你可以尝试一下 . 对于解析,使用递归下降,然后您可以在结果树上运行 . 如果您可以控制输入语言,则可以使用引用操作 .