2016-02-13 49 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

相關問題