2016-02-13 48 views
2

断言布尔条件我有这样的条件的字符串:保存在一个字符串

string conditions = "true && true || false || true "; 

如何断言,整个字符串是真或假?

例如,这样的事情:

if(Assert(conditions) == true){ 
    // passed 
} 

我需要的东西在C#中现成的不用借助第三方库。

+1

他对解析布尔语句的* string *表示感兴趣。该链接不会那样做。 –

+0

好的。我的误解。 +1 – intboolstring

+1

的确,我有一个布尔语句的字符串表示。 – Bill

回答

1

这是一种静态方法,它可以做你想做的事情,但它是SLOOOW!

public static object Eval(string booleanExpression) { 

    var c = new Microsoft.CSharp.CSharpCodeProvider(); 
    var icc = c.CreateCompiler(); 
    var cp = new System.CodeDom.Compiler.CompilerParameters(); 

    cp.CompilerOptions = "/t:library"; 
    cp.GenerateInMemory = true; 

    StringBuilder sb = new StringBuilder(""); 
    sb.Append("using System;\n"); 

    sb.Append("namespace BooleanEvaluator{ \n"); 
    sb.Append("public class BooleanEvaluator{ \n"); 
    sb.Append("public bool Evaluate(){\n"); 
    sb.Append("return "+booleanExpression+"; \n"); 
    sb.Append("} \n"); 
    sb.Append("} \n"); 
    sb.Append("}\n"); 

    var cr = icc.CompileAssemblyFromSource(cp, sb.ToString()); 

    System.Reflection.Assembly a = cr.CompiledAssembly; 
    object o = a.CreateInstance("BooleanEvaluator.BooleanEvaluator"); 

    Type t = o.GetType(); 
    MethodInfo mi = t.GetMethod("Evaluate"); 

    return (bool) mi.Invoke(o, null); 
} 

但是,戴表明标记生成器和分析器可以很容易地与ANTLR和一个布尔表达式文法生成。这将会快得多!请参阅:ANTLR v3 grammar for boolean/conditional expression

+0

非常好,这会做。我不能添加任何第三方软件,并且我不希望表达式比10条语句的格式更长,所以没关系。非常感谢。 – Bill

1

用一个平凡的记号器解析字符串,除非你知道你会有括号化的操作(在这种情况下使用有限状态自动机解析器) - 这会将字符串转换为对象表示,然后使用分流码算法评估字符串。

在你的问题中举例说明的语法看起来很简单,采用没有括号的等优先运算符会严重限制可能的表达类型。

+0

我认为System.Data.DataTable可以在不写分析器的情况下做到这一点 – RafaelCaballero

+0

我确实可以编写一个分析器,但是有些东西可用吗? – Bill

相关问题