【问题标题】:C#: How to parse arbitrary strings into expression trees?C#:如何将任意字符串解析为表达式树?
【发布时间】:2009-04-22 08:55:16
【问题描述】:

在我正在进行的一个项目中,我必须使用一个相当奇怪的数据源。我可以给它一个“查询”,它会返回一个 DataTable。但是查询不是传统的字符串。它更像是......一组定义我想要的标准的方法调用。大致如下:

var tbl = MySource.GetObject("TheTable");
tbl.AddFilterRow(new FilterRow("Column1", 123, FilterRow.Expression.Equals));
tbl.AddFilterRow(new FilterRow("Column2", 456, FilterRow.Expression.LessThan));
var result = tbl.GetDataTable();

本质上,它支持所有标准的东西(布尔运算符、括号、一些函数等),但编写它的语法非常冗长,不适合日常使用。

我想制作一个小解析器来解析给定的表达式(如"Column1 = 123 AND Column2 < 456")并将其转换为上述函数调用。另外,如果我可以在那里添加参数会很好,这样我就可以免受注入攻击。最重要的一点是它是否可以缓存解析结果并在要在另一个对象上重新执行相同的查询时重用它们。

所以我想知道 - 是否有任何现有的解决方案可供我使用,或者我是否必须推出自己的表达式解析器?这不是太复杂,但如果我可以节省两三天的编码时间和大量需要修复的错误,那将是值得的。

【问题讨论】:

    标签: c# .net parsing expression-trees


    【解决方案1】:

    试试Irony。尽管缺少文档,但示例可以帮助您快速启动和运行。 Irony 是一个用于解析代码和构建抽象语法树的项目,但您可能需要编写一些逻辑来创建适合您需求的表单。 DLR 可能是对此的补充,因为它可以从抽象语法树动态生成/执行代码(它用于 IronPython 和 IronRuby)。两者应该是很好的一对。

    哦,它们都是一流的 .NET 解决方案和开源软件。

    【讨论】:

    • 看起来很大。我的需要很小。 :P
    • Irony 程序集大小为 171 KB(调试版本)。如果需要,您可以将其编译到您的应用程序中,因为源代码可用。根据您的需要,使用它应该非常简单(即代码不多)。我在表达式解析器/评估器项目中使用它,代码只有几百行,尽管我的表达式语言比你描述的要复杂得多。另一方面,DLR 确实有点大,但对你来说并不是必需的 :)
    【解决方案2】:

    Bison 或 JavaCC 等会根据语法生成解析器。然后,您可以使用自己的代码扩充树的节点以转换表达式。

    OP cmets: 我真的不想用我的软件发布第 3 方可执行文件。我希望它在我的代码中编译。

    这两个工具都会生成源代码,您可以使用它们进行链接。

    【讨论】:

    • 我真的不想用我的软件发布第 3 方可执行文件。我希望它在我的代码中编译。
    【解决方案3】:

    我手工编写了一个解析器来精确分析这种用法和复杂性。大约花了2天时间。我很高兴我做到了,但我不会再这样做了。我会使用 ANTLR 或 F# 的 Fslex。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多