Я строю анализатор выражений, из которого я хотел бы сгенерировать код запроса к базе данных, я довольно далеко продвинулся, но я застрял при точном разборе BinaryExpressions. Их довольно легко разбить на левую и правую, но мне нужно определить круглые скобки и соответственно сгенерировать свой код, и я не вижу, как это сделать.
Пример [пожалуйста, игнорируйте некорректную логику:)]:
a => a.Line2 != "1" && (a.Line2 == "a" || a.Line2 != "b") && !a.Line1.EndsWith("a")
Мне нужно обнаружить 'set' в середине и сохранить их группировку, но я не вижу никакой разницы в выражении по сравнению с обычным 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 правильно отделяют части скобок от других, но не указывают, что это набор из-за скобок.