2009-09-17 35 views
2

我正在寻找可以在查询过滤器上操作的解析器。但是,我不太清楚术语,所以它证明了辛勤工作。我希望有人能帮助我。我已经阅读了“递归下降解析器”,但是我想知道这些是否适用于全面的语言解析器,而不是我正在寻找的逻辑表达式评估。查询过滤器表达式树的解析器

理想情况下,我在寻找.NET代码(C#),但也使用了类似的T-SQL中的解析器。

我想要的是什么解析例如:

((A = B)|(E = 1))&(C < = d)

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

解析器最好问最少数量的问题必须计算出最终结果 - 例如,如果AND的一边是假的,则没有评估另一边的点,并且首先评估最容易的一面(即,在上面的表达式中,'c < = d'应该被假定为更快并且因此首先被评估。

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

非常感谢

回答

1

看看this。ANTLR是一个很好的解析器生成器,链接到的文章具有可以适应您的需求的工作代码。

+0

谢谢Vinay。这真的很有帮助,而且自从我发布这个问题以来,我学到了更多关于解析的知识。我一直在看.NET表达式树,并想知道这是否会起作用?看起来,定义语法的灵活性较低,但它是框架的一部分。唯一的问题是我找不到一个将字符串加载到树中,然后被“回调”以评估个体表达式的示例。我会继续寻找,但ANTLR目前看起来像解决方案。 谢谢,李 – 2009-09-17 14:25:55

+0

@李:您可以编写代码将您的ANTLR树转换为.Net表达式树,以便使用ANTLR中的AST功能进行评估。 – user7116 2009-11-02 15:32:46

0

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

+0

感谢Roel,但是这看起来专门针对C#语法和代码的后期执行。我更喜欢指定我自己的语法的灵活性,也不希望代码被系统执行,但被我的代码所忽略。 再次感谢您抽出时间。 – 2009-09-17 14:23:01

0

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

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

+0

感谢康斯坦丁 - 你知道任何例子吗?特别提供一些源文本,然后评估树中的表达式? – 2009-09-17 15:31:21

1

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

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

希望这会有所帮助!

+0

嗨 - 这是我一直在考虑的 - 与TinyPG一起。我喜欢TinyPG,因为它没有任何依赖性,但是,Irony现在似乎更加活跃。你知道Irony在性能上与其他解决方案相比有多好? Lee – 2009-11-02 10:04:36

+0

嗨,不,我不,我只是玩了一下。但作者似乎(非常)能干,而且他确信它比较好。他在今年的Lang.Net研讨会上发表了关于讽刺的文章(我已经编辑了我的答案,其中包括该演讲的链接)。 – andyp 2009-11-02 15:24:13

0

您可以为此使用.NET表达式树。这个例子其实很简单。

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

然后只要看看调试器中的“测试”。一切已经为你解析,你可以使用它。

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

+0

嗨 我不知道这是如何帮助解析表达式字符串。有Dynamic Linq,但似乎并不支持自己的(即none-c#,none-vb)语言。 – 2009-11-03 09:10:03

+0

哦,对不起。我以为你想解析实际的代码。 – 2009-11-03 18:05:31