metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-06-06 01:13 am

Парсерный оверкилл?

Внезапно понадобилось сделать парсер строк с грамматикой подобного вида:
ИмяКласса | ИмяКласса(Параметр0,...)

Можно было бы не вдумываясь, склепать что-нибудь типа "найти скобки, до скобок - имя класса, внутри скобок разделить по запятым".
Но мне домашний паук из розетки приказал это сделать на генераторах парсеров, в частности fslex/fsyacc, что заняло немного больше времени, но как минимум, я теперь смогу при необходимости нормально менять грамматику или писать новые парсеры, разобравшись на простом примере.

Проблема в следующем: не является ли использование вуду-знаний из драгонбука правильных методик оверкиллом? А то уже не первый раз на работе возникают споры на тему "почему нужно делать правильно и долго, если можно сделать быстро и, с некоторыми ограничениями, будет работать".

[identity profile] justy-tylor.livejournal.com 2011-06-05 11:42 pm (UTC)(link)
Наоборот. Генераторы парсеров это низкоуровневая EBNF на входе и обычно неудобный bottom-up на выходе.

Если же делать парсер на одном из рабочих языков проекта, то можно использовать в описании особые паттерны и комбинаторы (начиная с sepBy), специфичные для рассматриваемых грамматик, а также выдавать пользователю более вменяемый фидбэк при отклонении от них. Размер кода при этом может оказаться меньше, чем то, чем потом приходится обкручивать результаты *yacc.

[identity profile] metaclass.livejournal.com 2011-06-06 04:47 am (UTC)(link)
Да, на комбинаторах это должно быть явно гуманнее.