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' 应该被认为更快,因此首先被评估。

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

非常感谢

4

5 回答 5

1

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

编辑:在今年的 Lang.Net 研讨会上有一个关于 Irony的讨论。

希望这可以帮助!

于 2009-11-01T11:35:42.460 回答
1

看看这个。ANTLR 是一个很好的解析器生成器,链接到的文章有工作代码,您可能能够适应您的需要。

于 2009-09-17T10:19:22.900 回答
0

试试 Vici.Parser:在这里下载(免费),它是迄今为止我发现的最灵活的表达式解析器/求值器。

于 2009-09-17T13:23:03.233 回答
0

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

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

于 2009-09-17T15:19:20.930 回答
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。

于 2009-11-02T20:02:06.283 回答