Парсерный оверкилл?
Jun. 6th, 2011 01:13 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Внезапно понадобилось сделать парсер строк с грамматикой подобного вида:
ИмяКласса | ИмяКласса(Параметр0,...)
Можно было бы не вдумываясь, склепать что-нибудь типа "найти скобки, до скобок - имя класса, внутри скобок разделить по запятым".
Но мне домашний паук из розетки приказал это сделать на генераторах парсеров, в частности fslex/fsyacc, что заняло немного больше времени, но как минимум, я теперь смогу при необходимости нормально менять грамматику или писать новые парсеры, разобравшись на простом примере.
Проблема в следующем: не является ли использованиевуду-знаний из драгонбука правильных методик оверкиллом? А то уже не первый раз на работе возникают споры на тему "почему нужно делать правильно и долго, если можно сделать быстро и, с некоторыми ограничениями, будет работать".
ИмяКласса | ИмяКласса(Параметр0,...)
Можно было бы не вдумываясь, склепать что-нибудь типа "найти скобки, до скобок - имя класса, внутри скобок разделить по запятым".
Но мне домашний паук из розетки приказал это сделать на генераторах парсеров, в частности fslex/fsyacc, что заняло немного больше времени, но как минимум, я теперь смогу при необходимости нормально менять грамматику или писать новые парсеры, разобравшись на простом примере.
Проблема в следующем: не является ли использование
no subject
Date: 2011-06-05 11:03 pm (UTC)А то всякое бывает, от раздутия дистрибутива до maintenance nightmares...
no subject
Date: 2011-06-05 11:42 pm (UTC)Если же делать парсер на одном из рабочих языков проекта, то можно использовать в описании особые паттерны и комбинаторы (начиная с sepBy), специфичные для рассматриваемых грамматик, а также выдавать пользователю более вменяемый фидбэк при отклонении от них. Размер кода при этом может оказаться меньше, чем то, чем потом приходится обкручивать результаты *yacc.
no subject
Date: 2011-06-06 04:47 am (UTC)no subject
Date: 2011-06-05 11:51 pm (UTC)no subject
Date: 2011-06-06 04:46 am (UTC)Я с ходу не вспомню, как описать такую грамматику регэкспом, да чтобы на выходе сразу получить результат.
no subject
Date: 2011-06-06 05:11 am (UTC)[A-Za-z0-9]+\s*(\([a-z0-9]+(,\s*[a-z0-9]+)*\))?
no subject
Date: 2011-06-06 12:08 pm (UTC)no subject
Date: 2011-06-06 12:00 am (UTC)no subject
Date: 2011-06-06 04:45 am (UTC)no subject
Date: 2011-06-06 05:51 am (UTC)no subject
Date: 2011-06-08 08:53 am (UTC)no subject
Date: 2011-06-14 06:19 pm (UTC)no subject
Date: 2011-06-14 08:57 pm (UTC)a = ( a || char 'x' ++ something ) свалится в бесконечную рекурсию. В тоже время нормальный парсер-генератор такую грамматику вполне отработает. От мемоизации промежуточных результатов ничего не изменится.
Данная проблема принципиально неразрешима в рамках традиционных парсер комбинаторов, нужно имитировать один из универсальных алгоритмов парсинга. Часть библиотек отслеживает такую дурную рекурсию и ругаются, но это паллиатив.
no subject
Date: 2011-06-15 05:49 am (UTC)http://www.scala-lang.org/api/current/scala/util/parsing/combinator/PackratParsers.html
no subject
Date: 2011-06-15 08:42 am (UTC)no subject
Date: 2011-06-15 09:25 am (UTC)no subject
Date: 2011-06-06 05:19 am (UTC)no subject
Date: 2011-06-06 05:21 am (UTC)no subject
Date: 2011-06-06 05:36 am (UTC)Скилл проджектляйтера, тимлида и прочих архитектуреров как раз и заключается в умении ппавильно расставить весовые коэффициенты в компонентах этой троицы применительно к конкретной задаче, набору доступных ресурсов и прогнозируемому спросу. В общем виде, разумеется, решения нет.
Что касается пауков, то все ок, пока их не начинаешь путать с тараканами.
no subject
Date: 2011-06-06 06:16 am (UTC)если они не знают про парсер-комбинаторы зато джедаи в регэкспах - то вас нужно изолировать от общества их и дать им работу работать
no subject
Date: 2011-06-06 06:26 am (UTC)no subject
Date: 2011-06-14 06:18 pm (UTC)no subject
Date: 2011-07-09 05:58 pm (UTC)Если моё мнение интересует, то - является. Более того, Ваш вопрос надо переформулировать по-другому - является ли разумным использование формата, для парсинга которого нужны правильные методики.