斷言布爾條件我有這樣的條件的字符串:保存在一個字符串
string conditions = "true && true || false || true ";
如何斷言,整個字符串是真或假?
例如,這樣的事情:
if(Assert(conditions) == true){
// passed
}
我需要的東西在C#中現成的不用藉助第三方庫。
斷言布爾條件我有這樣的條件的字符串:保存在一個字符串
string conditions = "true && true || false || true ";
如何斷言,整個字符串是真或假?
例如,這樣的事情:
if(Assert(conditions) == true){
// passed
}
我需要的東西在C#中現成的不用藉助第三方庫。
這是一種靜態方法,它可以做你想做的事情,但它是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
非常好,這會做。我不能添加任何第三方軟件,並且我不希望表達式比10條語句的格式更長,所以沒關係。非常感謝。 – Bill
用一個平凡的記號器解析字符串,除非你知道你會有括號化的操作(在這種情況下使用有限狀態自動機解析器) - 這會將字符串轉換爲對象表示,然後使用分流碼算法評估字符串。
在你的問題中舉例說明的語法看起來很簡單,採用沒有括號的等優先運算符會嚴重限制可能的表達類型。
我認爲System.Data.DataTable可以在不寫分析器的情況下做到這一點 – RafaelCaballero
我確實可以編寫一個分析器,但是有些東西可用嗎? – Bill
他對解析布爾語句的* string *表示感興趣。該鏈接不會那樣做。 –
好的。我的誤解。 +1 – intboolstring
的確,我有一個布爾語句的字符串表示。 – Bill