Re: Парсер - писать самому или взять генератор
От: fortuna  
Дата: 15.06.09 13:09
Оценка:
Здравствуйте, 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 синтаксиса.

Хотя руками это тоже не страшно, строишь дерево по выражению, ну с глубины начинаешь считать результат.
Если надо потом будет часто что-то добавлять то однозначно генератор.
Если редко то тоже генератор
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.