我正在寻找可以在查询过滤器上操作的解析器。但是,我不太清楚术语,所以它证明了辛勤工作。我希望有人能帮助我。我已经阅读了“递归下降解析器”,但是我想知道这些是否适用于全面的语言解析器,而不是我正在寻找的逻辑表达式评估。查询过滤器表达式树的解析器
理想情况下,我在寻找.NET代码(C#),但也使用了类似的T-SQL中的解析器。
我想要的是什么解析例如:
((A = B)|(E = 1))&(C < = d)
理想的情况下,运营商可以自定义(例如'<'vs'lt','='vs'=='vs'eq'等),我们可以指定函数类型标签(例如(left(x,1)='e'))。解析器加载它,服从命令优先级(理想地处理缺少任何括号),然后用表达式回调我的代码以评估布尔结果 - 例如, 'A = B'?)。我不希望解析器理解表达式中的自定义函数(尽管一些基本的函数会很有用,比如字符串分割)。将表达式(分成左侧和右侧部分)很好。
解析器最好问最少数量的问题必须计算出最终结果 - 例如,如果AND的一边是假的,则没有评估另一边的点,并且首先评估最容易的一面(即,在上面的表达式中,'c < = d'应该被假定为更快并且因此首先被评估。
我可以想象,这是很多工作要做,然而,相当普遍。任何人都可以给我任何指针吗?如果没有像上面那样灵活的解析器,是否有任何基本的解析器可以使用作为一个开始?
非常感谢
李
谢谢Vinay。这真的很有帮助,而且自从我发布这个问题以来,我学到了更多关于解析的知识。我一直在看.NET表达式树,并想知道这是否会起作用?看起来,定义语法的灵活性较低,但它是框架的一部分。唯一的问题是我找不到一个将字符串加载到树中,然后被“回调”以评估个体表达式的示例。我会继续寻找,但ANTLR目前看起来像解决方案。 谢谢,李 – 2009-09-17 14:25:55
@李:您可以编写代码将您的ANTLR树转换为.Net表达式树,以便使用ANTLR中的AST功能进行评估。 – user7116 2009-11-02 15:32:46