В проекте, над которым я работаю, мне приходится работать с довольно странным источником данных. Я могу дать ему «запрос», и он вернет мне DataTable. Но запрос не является традиционной строкой. Это больше похоже на ... набор вызовов методов, которые определяют критерии, которые я хочу. Что-то вроде этого:
var tbl = MySource.GetObject("TheTable");
tbl.AddFilterRow(new FilterRow("Column1", 123, FilterRow.Expression.Equals));
tbl.AddFilterRow(new FilterRow("Column2", 456, FilterRow.Expression.LessThan));
var result = tbl.GetDataTable();
По сути, он поддерживает все стандартные вещи (булевы операторы, парантезы, несколько функций и т. Д.), Но синтаксис для его написания довольно многословен и неудобен для повседневного использования.
Я хотел создать небольшой синтаксический анализатор, который бы анализировал данное выражение (например, "Column1 = 123 AND Column2 < 456"
) и преобразовывал его в вызовы функций выше. Кроме того, было бы неплохо, если бы я мог добавить туда параметры, чтобы я был защищен от инъекционных атак. Последний маленький кусочек сахара вверху был бы, если бы он мог кэшировать результаты анализа и использовать их повторно, когда тот же запрос должен быть повторно выполнен для другого объекта.
Так что мне было интересно - есть ли какие-нибудь решения, которые я мог бы использовать для этого, или мне придется развернуть свой собственный анализатор выражений? Это не так уж сложно, но если я смогу сэкономить два или три дня написания кода и кучу ошибок для исправления, это того стоит.