2012-05-25 80 views
0

我想计算用户输入的表达式(有效逻辑表达式)的真值表作为字符串。任何人都可以发布一个现有的解决方案,或指导我这样做? 我正在考虑使用一个BitArray(大小为2 ^的变量)作为输出(真值表)。但不知道如何开始。请帮我解决一下这个。表达式的真值表(字符串)

例如: -

p or q or r 

应该导致作为

False True True True True True True True 

而且

a and b 

应该导致作为

False False False True 
+3

分享一些样本和所需的输出。 –

+1

您至少应该包含一些样本输入和输出。 –

回答

1

首先,你需要解析字符串输入查找的变量和表达式的结构(即哪些操作应用于哪些子表达式)。

一旦你完成了,你可以将变量的状态表示为二进制整数。对于这种表示形式,您可以从0开始(意思是所有变量都是假的),并将真值表的每一行的整数表示加1。通过这种方式,您可以将所有可能的组合考虑在一起。

然后将变量的值应用到表达式中(根据所讨论变量的整数位值来代替true/false),并对表达式的值进行计算。

如果您想要紧凑表示结果,您可以将每个输入组合的表达式值存储在线性集合(例如矢量)中,其中输出的索引对应于上述变量值的整数表示形式。如果你知道什么变量映射到哪个位的输入,你可以在任何时候重新创建全表(例如打印)

+0

您能否详细介绍一下它的解析部分。有没有内置的解析器可以做到这一点? – Dynamite

+0

你可以看看[这个问题]的答案(http://stackoverflow.com/questions/2292003/boolean-and-math-expression-parser),看看是否有任何符合你的需求。 – Attila

1

没有任何第三方库的方式是使用带表达式的DataTable。

在那里你甚至可以评估其他结果值类型而不仅仅是布尔值。

System.Data.DataTable table = new System.Data.DataTable(); 
table.Columns.Add("", typeof(Boolean)); 
table.Columns[0].Expression = "true and false or true"; 

System.Data.DataRow r = table.NewRow(); 
table.Rows.Add(r); 
Boolean result = (Boolean)r[0]; 

表达式语法与您的示例不一样,但它做同样的事情。一个好处是它的100%.NET框架包含 - > Microsoft管理。 错误处理也不坏。例外缺少运营商等......

available operators

1

我认为CKen(http://cken.sourceforge.net/)(对你有好处)。我们支持''大写''和''小写'',所以它支持58(= 2×29)个单变量!

而且最重要的是,多表现在它可以使用(由分隔符):

例子:a,b,c,d,e;(a+b)*c;d*e#a;

在另一方面,它是非常快的!


您必须在表达式中使用它(变量)之前定义变量。