5

在我正在进行的一个项目中,我必须使用一个相当奇怪的数据源。我可以给它一个“查询”,它会返回一个 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")并将其转换为上述函数调用。另外,如果我可以在那里添加参数会很好,这样我就可以免受注入攻击。顶部的最后一点糖是如果它可以缓存解析结果并在要在另一个对象上重新执行相同的查询时重用它们。

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

4

3 回答 3

7

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

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

于 2009-04-22T09:01:20.600 回答
0

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

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

这两个工具都会生成源代码,您可以将其链接。

于 2009-04-22T09:01:50.553 回答
0

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

于 2009-04-22T18:15:01.440 回答