C#:如何将任意字符串解析为表达式树?

时间:2009-04-22 08:55:17

标签: c# .net parsing expression-trees

在我正在进行的项目中,我必须使用相当奇怪的数据源。我可以给它一个“查询”,它会返回一个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();

本质上,它支持所有标准的东西(布尔运算符,parantheses,一些函数等),但是编写它的语法对于日常使用来说非常冗长和不舒服。

我想创建一个解析给定表达式的小解析器(如"Column1 = 123 AND Column2 < 456")并将其转换为上述函数调用。此外,如果我可以在那里添加参数,那将是很好的,所以我将受到保护免受注入攻击。顶部的最后一小块糖就是它可以缓存解析结果并在同一个查询要在另一个对象上重新执行时重用它们。

所以我想知道 - 有没有我可以使用的现有解决方案,还是我必须推出自己的表达式解析器?这不是太复杂,但如果我可以节省两到三天的编码和一堆错误来修复,那就值得了。

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

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

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

这两个工具都会生成与您链接的源代码

答案 2 :(得分:0)

也请检查此链接。似乎适合您的目标:

Parsing Expression Grammar

答案 3 :(得分:0)

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