Pull to refresh

Comments 11

У комбинаторных парсеров есть большой недостаток: трудно сделать правильные диагностические сообщения в случае ошибок.

А для eDSL очень часто можно использовать YAML.
Я не вникал сильно в тему, но как мне кажется нет никакой проблемы сделать так, чтобы если комбинатор не разобрал, то вернул сообщение об ошибке. В Parsec есть точно такой «способ». Или имелось в виду другие диагностические сообщения?
Дело в том, что у комбинаторных парсеров такие ошибки — это штатная ситуация. Вот если сделать синтаксическую ошибку в одном из question, то парсер будет ругаться на Section в целом.
То, что из-за синтаксической ошибки в question, вся Section будет «скомпрометирована» скорее всего так решил автор. Если такая синтаксическая ошибка не так важна, вполне возможна другая стратегия вычисления. Можно возвращать не только ошибку, но и результат, который удалось аккумулировать, и дальше продолжать парсить. Комбинаторы на то и удобны, что должны позволить лучше управлять процессом вычисления.
Так «решил» не автор, а комбинатор Many. Наткнувшись на невалидный question, он прекращает парсинг и делает откат (недетерминированный парсер же). Причём, считая его успешным. Ему-то всё равно сколько question'ов выбрать. а дальше на этот невалидный question натыкается парсер, ожидающий "]". Вот он и валится, и вместе с ним вся section.
А поскольку sections тоже объединены комбинатором many, то результат будет: «спарсили успешно, но ещё остались входные данные». И никакого указания на точное место ошибки.
Без перестроения грамматики это не вылечить. А если менять грамматику — вся прелесть комбинаторов исчезнет.
спасибо!
Давно посматривал в сторону подобных парсеров, однако побаивался сложности и писал разбор на regex-ах ^_^
Сам интересуюсь этой темой, есть такие альтернативы для построения парсеров, генераторв, компиляторов и.т.д.:
EMF — создания объектных моделей для генераторв
Cocktail — построение генераторов программ, компиляторов
ANTLR — парсер генератор
Nemerle/PegGrammar — построение AST на основе грамматики.
— R# — надстройка над C#, генерирует AST для C#
Еще совсем недавно вышел перевод книжки про DSL Мартина Фаулера.
Ссылка на описание оригинала: martinfowler.com/books.html#dsl
Ссылка на перевод на сайте издательства: www.williamspublishing.com/Books/978-5-8459-1738-6.html
Мне эта книжка пришла пару недель назад по предзаказу, очень рекомендую.
Книга Мартина Фаулера «Предметно-ориентированные языки программирования» (Domain-Specific Languages, DSL) входит в знаменитую серию Addison-Wesley Signature Series. Многие книги из этой серии изданы на русском языке и обсуждаются в блоге Виктора Штонда (издателя)
Закончил читать эту статью на английском и полез на Хабр: посмотреть, вдруг тут по Sprache что-то есть. И натыкаюсь на неё же переведённую! Вот же ш! )
Sign up to leave a comment.

Articles