Написание парсера (для языка разметки): Теория и практика

Я хотел бы написать идиоматический синтаксический анализатор для языка разметки, такого как Markdown. Моя версия будет немного отличаться, но я ощущаю хотя бы небольшую потребность в чем-то подобном в Clojure, и я хотел бы получить ее.

Я не хочу использовать беспорядок RegExes (хотя я понимаю, что некоторые, возможно, понадобятся), и Я хотел бы сделать что-то мощное и в идиоматическом Clojure.

Я начал несколько разных попыток (в основном на бумаге), но я очень доволен ими, поскольку чувствую, что я просто импровизирую. Это было бы хорошо, но я провел много исследований на языке Clojure за последние месяц или два и хотел бы, по крайней мере частично, следовать по пути гигантов.

Я бы хотел, чтобы некоторые указатели, предложения или ресурсы (книги из О'Рейли были бы замечательными - полюбите мне некоторые электронные книги, но Amazon или там, где это было бы здорово). Что бы вы ни предложили.

EDIT Брайан Карпер имеет интересный пост с использованием ANTLR от Clojure.

Там также clojure-pg и fnparse, которые являются Clojure генераторами-парсерами. fnparse даже похоже, что у него есть приличная документация.

Ищите ресурсы и т.д.! Просто подумал, что я обновляю их своими выводами.

Ответы

Ответ 1

Существует также clj-peg проект, который позволяет указать грамматику PEG для анализа данных

Ответ 2

Лучше всего я могу подумать, что Терренс Парр - парень, который возглавляет генератор парсеров ANTLR написал язык разметки, документированный здесь. Во всяком случае, там есть исходный код.

Ответ 3

Другой, еще не упомянутый здесь, clarsec, порт библиотеки парсеков Haskell.

Недавно я был очень похож на создание парсера в Clojure. Я прошел довольно далеко по пути fnparse, в частности, используя (еще не выпущенный) fnparse 3, который вы можете найти в develop ветке на GitHub. Он разбит на две формы: собака (специально для LL (1) синтаксические анализаторы) и cat, которая является парсером packrat. Оба являются функциональными парсерами, построенными на монадах (например, clarsec). У fnparse есть впечатляющая работа - возможность документировать ваш парсер, создавать сообщения об ошибках и т.д. - это аккуратно. Документация по ветке разработки не существует, хотя и не является функцией docstrings, что на самом деле неплохо. В конце концов, я ударил несколько дорожных блоков, пытаясь заставить LL (k) работать. Я думаю, что это возможно, чтобы заставить его работать, это просто трудно без достойного набора примеров того, как сделать откат работы хорошо. Я также так хорошо знаком с парсерами, которые разделяют лексинг и синтаксический анализ, что мне трудно было так думать. Я все еще очень заинтересован в этом как хорошее решение в будущем.

Тем временем я вернулся к Antlr, который является очень надежным, хорошо перемещенным, хорошо документированным ( в двух книгах) и т.д. У него нет Clojure back-end, но я надеюсь, что это будет в будущем, что сделало бы его очень приятным для работы парсера. Я использую его для лексинга, разбора, преобразования дерева и шаблонов с помощью StringTemplate. Это было не совсем безупречно, но до сих пор я смог найти приемлемые решения для всех проблем. Уникальный алгоритм синтаксического анализа LL (*) Antlr позволяет писать действительно читаемые грамматики, но все же делает их достаточно эффективными (и постепенно настраивает их, если они не являются).

Ответ 4

Два функциональных переводчика разметки: