断言布尔条件我有这样的条件的字符串:保存在一个字符串
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