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