Здравствуйте, bybor, Вы писали:
B>Надо написать парсер выражений. Язык программирования — C#. В выражении могут быть арифметические операции, предопределенные функции (MIN, MAX, ABS, ...), и в качестве переменных — названия полей таблиц базы данных. Парсер будет использоваться для "вычисляемых" полей в отчётах. Вычисление будет задаваться выражением, которое требуется разобрать (желательно на этапе ввода, чтобы не заниматься этим при отображении отчёта), подставить туда значения для текущего кортежа и вернуть результат.
B>Как я понимаю, задача сводится к обычному "калькулятору" с возможностью задания переменных.
B>Вопрос собственно по реализации. Можно всё это сделать самому или попробовать ANTLR (Coco/R ? ).
B>Опыта в этой области нет вообще. Если делать самому, то всё не очень страшно, но смущает дальнейшее расширение функциональности. Например, логические операции или ещё что-нить такое. В готовых примерах, на которые я натыкался — на том же CodeProject, почти весь код имеет некоторые ограничения — например поддержка унарных операторов или вложенные скобки в логических выражениях. Я не понимаю, являются ли эти задачи сложными для реализации, или они настолько тривиальны, что авторы не стали тратить на это время.
B>Может быть лучше будет построить грамматику и использовать ANTLR/CocoR для генерации кода парсера на C#? Насколько это будет трудоёмко для чайника? И насколько хорошо в эту грамматику лягут названия полей из базы данных?
B>Время на разработку как бы есть, но чем быстрее, тем лучше.
B>Спасибо.
Бери генератор аля Yacc Bison + Lex( Flex ) , ну или похожие инструменты,
потратишь время на то, чтобы разобраться и долетишь за 5 мин,
плюс дальше времени на изменения в синтаксисе или функционале будут занимать минимум времени.
Я в свое время только на lex, сделал парсер wiki синтаксиса.
Хотя руками это тоже не страшно, строишь дерево по выражению, ну с глубины начинаешь считать результат.
Если надо потом будет часто что-то добавлять то однозначно генератор.
Если редко то тоже генератор