用于查询过滤器表达式树的解析器

时间:2009-09-17 10:13:00

标签: c# tsql parsing expression-trees

我正在寻找可以在查询过滤器上运行的解析器。但是,我不太确定这个术语,所以它证明了很难。我希望有人可以帮助我。我读过“递归下降解析器”,但我想知道这些是否适用于完整的语言解析器而不是我正在寻找的逻辑表达式评估。

理想情况下,我正在寻找.NET代码(C#),但也是一个在T-SQL中工作的类似解析器。

我想要的是要解析的东西,例如:

((A = B)|(E = 1))及(℃下= d)

理想情况下,运算符可以定义(例如'<'vs'lt','='vs'=='vs'eq'等)我们可以指定函数类型标签(例如(左)(x ,1)= 'E'))。解析器加载它,服从顺序优先级(并且理想地处理缺少任何括号)然后使用表达式回调我的代码以评估布尔结果 - 例如'A = B'?)。我不希望解析器理解表达式中的自定义函数(尽管一些基本函数会很有用,比如字符串拆分)。将表达式拆分(放入左手和右手部分)会很不错。

最好解析器要求最小数量的问题必须计算出最终结果 - 例如如果AND的一侧是假的,则没有评估另一侧的点,并且首先评估最简单的一侧(即在上面的表达式中,'c&lt; = d'应该被假定为更快并因此首先进行评估。< / p>

我可以想象,这是很多工作要做,但是,相当普遍。任何人都可以给我任何指示吗?如果没有像上面那样灵活的解析器,是否有任何我可以用作开头的基本解析器?

非常感谢

5 个答案:

答案 0 :(得分:1)

看看this。 ANTLR是一个很好的解析器生成器,链接到文章有工作代码,您可以根据自己的需要进行调整。

答案 1 :(得分:1)

您可以查看Irony。有了它,您可以使用与bnf相距甚远的语法在C#代码中定义语法。他们甚至在他们的网站(表达式评估器)上有一个简单的例子,它似乎与你想要达到的目标非常接近。

编辑:今年的Lang.Net研讨会上有一个talk about Irony

希望这有帮助!

答案 2 :(得分:0)

尝试Vici.Parser:download it here (free),它是迄今为止我发现的最灵活的表达式解析器/评估器。

答案 3 :(得分:0)

如果可以,请使用.Net 3.5表达式。

编译器为您解析表达式,并为您提供表达式树,您可以根据需要进行分析和使用。不是很简单但可行(实际上IQueryable接口的所有实现都是这样做的。)

答案 4 :(得分:0)

您可以使用.NET表达式树。这个例子实际上非常简单。

Expression<Func<int, int, int, int, bool>> test = (int a, int b, int c, int d) => ((a == b) | (c == 1)) & (c <= d);

然后只需在调试器中查看“test”即可。一切都已经为你解析了,你可以使用它。

唯一的问题是在.NET 3.5中,Func中最多只能包含4个参数。所以,我在一个地方将“e”改为“c”。在4.0中,此限制更改为16。