Writing a Parser (for a markup language): Theory & Practice

I'd like to write an idiomatic parser for a markup language like Markdown. My version will be slightly different, but I perceive at least a minor need for something like this in Clojure, and I'd like to get on it.

I don't want to use a mess of RegExes (though I realize some will probably be needed), and I'd like to make something both powerful and in idiomatic Clojure.

I've begun a few different attempts (mostly on paper), but I'm terribly happy with them, as I feel as though I'm just improvising. That would be fine, but I've done plenty of exploring in the language of Clojure in the past month or two, and would like to, at least in part, follow in the paths of giants.

I'd like some pointers, or suggestions, or resources (books from O'Reilly would be awesome–love me some eBooks–but Amazon or wherever would be great, too). Whatever you can offer.

EDIT Brian Carper has an interesting post on using ANTLR from Clojure.

There's also clojure-pg and fnparse, which are Clojure parser-generators. fnparse even looks like it's got some decent documentation.

Still looking for resources etc! Just thought I'd update these with some findings of my own.

14
задан CraigTeegarden 6 April 2013 в 20:49
поделиться

4 ответа

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

5
ответ дан 1 December 2019 в 13:47
поделиться

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

6
ответ дан 1 December 2019 в 13:47
поделиться

Еще один, еще не упомянутый здесь, - это Clarsec , порт библиотеки parsec Haskell.

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

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

4
ответ дан 1 December 2019 в 13:47
поделиться

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

2
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: