我正在构建一个表达式分析器,我想从中生成数据库查询代码,我已经走了很长一段路,但我无法准确地解析 BinaryExpressions。将它们分成左右很容易,但我需要检测括号并相应地生成我的代码,我看不出如何做到这一点。
一个例子[请忽略有缺陷的逻辑:)]:
a => a.Line2 != "1" && (a.Line2 == "a" || a.Line2 != "b") && !a.Line1.EndsWith("a")
我需要检测中间的“集合”并保留它们的分组,但在解析过程中我看不到表达式与正常 BinaryExpression 的任何差异(我不想检查括号中的字符串表示)
任何帮助,将不胜感激。
(我可能应该提到我正在使用 C#)
--Edit-- 我没有提到我正在使用标准的 .Net Expression 类来构建表达式(System.Linq.Expressions 命名空间)
--Edit2-- 好的,我不是将文本解析为代码,而是将代码解析为文本。所以我的 Parser 类有一个这样的方法:
void FilterWith<T>(Expression<Func<T, bool>> filterExpression);
它允许您编写如下代码:
FilterWith<Customer>(c => c.Name =="asd" && c.Surname == "qwe");
使用标准的 .Net 类很容易解析,我的挑战是解析这个表达式:
FilterWith<Customer>(c => c.Name == "asd" && (c.Surname == "qwe" && c.Status == 1) && !c.Disabled)
我的挑战是将括号之间的表达式保持为一个集合。.Net 类正确地将括号部分与其他部分分开,但由于括号而没有表明它是一个集合。