C #: Как разобрать произвольные строки в деревья выражений? - PullRequest
4 голосов
/ 22 апреля 2009

В проекте, над которым я работаю, мне приходится работать с довольно странным источником данных. Я могу дать ему «запрос», и он вернет мне 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") и преобразовывал его в вызовы функций выше. Кроме того, было бы неплохо, если бы я мог добавить туда параметры, чтобы я был защищен от инъекционных атак. Последний маленький кусочек сахара вверху был бы, если бы он мог кэшировать результаты анализа и использовать их повторно, когда тот же запрос должен быть повторно выполнен для другого объекта.

Так что мне было интересно - есть ли какие-нибудь решения, которые я мог бы использовать для этого, или мне придется развернуть свой собственный анализатор выражений? Это не так уж сложно, но если я смогу сэкономить два или три дня написания кода и кучу ошибок для исправления, это того стоит.

Ответы [ 4 ]

7 голосов
/ 22 апреля 2009

Попробуйте Ирония . Несмотря на то, что документации не хватает, примеры помогут вам быстро приступить к работе. Irony - это проект для анализа кода и построения абстрактных синтаксических деревьев, но вам, возможно, придется написать небольшую логику, чтобы создать форму, соответствующую вашим потребностям. DLR может быть дополнением к этому, поскольку он может динамически генерировать / выполнять код из абстрактных синтаксических деревьев (он используется для IronPython и IronRuby). Два должны составить хорошую пару.

О, и они оба первоклассные .NET-решения и с открытым исходным кодом.

0 голосов
/ 22 апреля 2009

Я написал парсер для точного использования и уровня сложности вручную. Прошло около 2 дней. Я рад, что сделал это, но я бы не стал делать это снова. Я бы использовал ANTLR или F # Fslex.

0 голосов
/ 22 апреля 2009

Проверьте также эту ссылку. Кажется подходящим для вашей цели:

Грамматика синтаксического анализа выражения

0 голосов
/ 22 апреля 2009

Bison, JavaCC и т. П. Будут генерировать синтаксический анализатор из грамматики. Затем вы можете дополнить узлы дерева своим собственным кодом для преобразования выражения.

OP комментарии: Я действительно не хочу отправлять сторонние исполняемые файлы с моим программным обеспечением. Я хочу, чтобы это было скомпилировано в моем коде.

Оба инструмента генерируют исходный код , с которым вы связываетесь.

...