【问题标题】:Assert boolean conditions saved in a string断言保存在字符串中的布尔条件
【发布时间】:2016-02-13 00:08:59
【问题描述】:

我有一个条件如下的字符串:

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

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

例如,像这样的:

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

我需要一些在 C# 中现成的东西,而无需借助 3rd 方库。

【问题讨论】:

  • 他对解析布尔语句的字符串表示感兴趣。该链接不会这样做。
  • 好的。我的误解。 +1
  • 确实,我有一个布尔语句的字符串表示形式。
  • 我认为是重复的:stackoverflow.com/questions/8476422/…
  • 您的问题中举例说明的语法似乎很简单,计算能力也不是很强。您有任何运算符优先级规则吗?括号内的子表达式呢?

标签: c#


【解决方案1】:

这是一个静态方法,可以做你想做的事,但它很慢!!

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);
}

但是,Dai 建议的分词器和解析器可以使用ANTLR 和布尔表达式语法轻松生成。那会快很多!见:ANTLR v3 grammar for boolean/conditional expression

【讨论】:

  • 太好了,这样就可以了。我无法添加任何第 3 方软件,并且我不希望表达式长于 10 条语句的最大值,所以没关系。非常感谢。
【解决方案2】:

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

您的问题中举例说明的语法似乎很简单,采用不带括号的等优先运算符将严重限制可能的表达式类型。

【讨论】:

  • 我认为 System.Data.DataTable 无需编写解析器就可以解决问题
  • 我确实可以写一个解析器,但是有什么现成的吗?
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2010-10-15
  • 2017-07-15
  • 1970-01-01
  • 2018-12-14
  • 2019-06-21
  • 2016-01-12
  • 2019-10-17
相关资源
最近更新 更多