C# 表达式的真值表(作为字符串)

C# 表达式的真值表(作为字符串),c#,parsing,truthtable,C#,Parsing,Truthtable,我想计算用户作为字符串输入的表达式(有效逻辑表达式)的真值表。有人可以发布一个现有的解决方案或指导我这样做吗?? 我正在考虑使用一个位数组(大小为2^个变量)作为输出(真值表)。但不知道如何开始。请帮我做这个 例如: 结果应该是 False True True True True True True True False False False True 及 结果应该是 False True True True True True True True False False

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

例如:

结果应该是

 False True True True True True True True 
 False False False True 

结果应该是

 False True True True True True True True 
 False False False True 

没有任何第三方库的一种方法是使用带有表达式的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托管。 错误处理也不错。缺少运算符等的例外情况


没有任何第三方库的方法是使用带有表达式的数据表

在这里,您甚至可以对其他结果值类型求值,而不仅仅是布尔值

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托管。 错误处理也不错。缺少运算符等的例外情况

首先,您需要解析字符串输入,以找到变量和表达式的结构(即,对哪些子表达式应用了哪些操作)

完成后,可以将变量的状态表示为二进制整数。使用此表示法,您可以从0开始(表示所有变量都为false),并为真值表的每一行将整数表示法递增1。这样,您就可以一次准确地解释所有可能的组合

然后将变量的值应用于表达式(根据相关变量的整数位值替换true/false),并计算表达式的值

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

首先,您需要解析字符串输入以找到变量和表达式的结构(即,对哪些子表达式应用了哪些操作)

完成后,可以将变量的状态表示为二进制整数。使用此表示法,您可以从0开始(表示所有变量都为false),并为真值表的每一行将整数表示法递增1。这样,您就可以一次准确地解释所有可能的组合

然后将变量的值应用于表达式(根据相关变量的整数位值替换true/false),并计算表达式的值

如果希望结果的紧凑表示,可以将每个输入组合的表达式值存储在线性集合(例如向量)中,其中输出的索引对应于变量值的上述整数表示。如果您知道哪些变量映射到输入的哪个位,您可以随时重新创建完整的表(例如打印)

我认为CKen()(对您有好处)

CKen同时支持“大写”和“小写”,因此它支持58(=2x29)个单变量

最重要的是,可以在其中使用多个表达式(通过分隔符):

示例:
a、b、c、d、e;(a+b)*c;d*e#a

另一方面,它非常快


在表达式中使用变量之前,必须先定义变量。我认为CKen()(对您有好处)

CKen同时支持“大写”和“小写”,因此它支持58(=2x29)个单变量

最重要的是,可以在其中使用多个表达式(通过分隔符):

示例:
a、b、c、d、e;(a+b)*c;d*e#a

另一方面,它非常快



在表达式中使用变量之前,您必须先定义变量。

共享一些示例和所需的输出。您至少应该包含一些示例输入和输出。共享一些示例和所需的输出。您至少应该包含一些示例输入和输出。请您详细介绍一下其中的解析部分。是否有任何内置的解析器可以做到这一点??您可以查看的答案,看看是否有任何符合您的需要。请您告诉更多关于它的解析部分。是否有任何内置解析器可以做到这一点??您可以查看的答案,看看是否有任何匹配您的需要。