C#解析"(真实和真实)或(真或假)"

Ash*_*Ash 4 c# string eval boolean-expression

C#:我有一个字符串变量,如下所示:

 string a = "(true and true) or (true or false)";
Run Code Online (Sandbox Code Playgroud)

这可以是任何东西,它可以变得更复杂,如:

 string b = "((true and false) or (true or false) and not (true and false)) and false";
Run Code Online (Sandbox Code Playgroud)

我所知道的是它是正确的.不能发生这种表达不能被"评估".

有什么方法可以以某种方式评估这个吗?我只想知道该字符串的结果(结果).这意味着我需要"true"或"false"而不是此字符串.

我想我可以做一个解析方法来做到这一点,逐步减少字符串,直到我们得到最终值,但我想知道是否有更好的方法.

Joã*_*elo 10

扩展Rob的注释,您可以将运行时编译与C#4.0 dynamic支持结合使用,并执行以下操作:

var expression = "(true and false) or (true or false)";

var helper = "" + 
    "using System; " + 
    "public class Expression {{ public bool Eval() {{ return {0}; }} }}";

var replaced = expression.Replace("and", "&&").Replace("or", "||");

var references = new string[] { "System.dll" };
var parameters = new CompilerParameters(references, "Test.dll");
var compiler = new CSharpCodeProvider();


var results = compiler.CompileAssemblyFromSource(
    parameters, 
    String.Format(helper, replaced));

dynamic exp = Activator.CreateInstance(
    results.CompiledAssembly.GetType("Expression"));

Console.WriteLine(exp.Eval());
Run Code Online (Sandbox Code Playgroud)


Jef*_*dge 7

这样的事可能吗?

string previous = string.Empty;
while (b != previous) 
{
     previous = b;
     b = b.Replace("true and false", "false");
     b = b.Replace("true and true", "true");
     b = b.Replace("false and true", "false");
     b = b.Replace("false and false", "false");
     b = b.Replace("false or false", "false");
     b = b.Replace("true or false", "true");
     b = b.Replace("true or true", "true");
     b = b.Replace("false or true", "true");
     b = b.Replace("(false)", "false");
     b = b.Replace("(true)", "true");
     b = b.Replace("not false", "true");
     b = b.Replace("not true", "false");
 }
Run Code Online (Sandbox Code Playgroud)

请注意,该规范允许使用不同的配方,例如:

"false and false or true"
"false and true or true"
Run Code Online (Sandbox Code Playgroud)

这两种表述的是"真",如果如果是第一evaluted,和"假" 还是第一次评估.因此,要求每个级别的括号都会更好.需要从左到右评估是另一种选择,但这会使代码更复杂一些.

对于那些可能反对这种问题解决方案的人,请记住,一些数学家认为所有的数学都可以简化为这种符号操作.这是说,罗素和怀特海的主要批评之一的数学原理是,它embues太多意义的公式.