ЧАВо по лексическому и синтаксическому разборам
November 8, 2023 · View on GitHub
Что из общего почитать по теме?
Dick Grune, Ceriel J.H. Jacobs. Parsing Techniques: A Practical Guide (Monographs in Computer Science) 2nd ed. 2008 Edition
пока пусто
Шень А. Программирование: теоремы и задачи.
Комментарий от @ksromanov. Приятно написанная книга для начинающих: хороший баланс между строгостью и понятностью, в последних двух главах просто и понятно рассказывается про некоторые типы контекстно-свободных грамматик, рассказывается про разные методы разбора, в том числе и метод рекурсивного спуска. Фактически, главы 15 и 16 самодостаточны, и являются «дешёвым и сердитым» введением в задачу грамматического (синтаксического) разбора, чтобы понимать о чём вообще идёт речь, и как примерно всё устроено.
A. Afroozeh, A. Izmaylova. Practical general top-down parsers
https://pure.uva.nl/ws/files/36086100/Thesis.pdf
Комментарий от @gsvgit. Хороший материал для желающих более глубоко изучить одно из современных направлений развития алгоритмов синтаксического анализа — обощённый нисходящий синтаксический анализ. Рассмотрены не только особенности алгоритма, но и такие вопросы как разрешение неоднозначеностей, подходы к data-dependent parsing. Работа интересна как сама по себе, так и представленными в ней ссылками на другие работы.
Giorgios Robert Economopoulos. Generalised LR parsing algorithms
Комментарий от @gsvgit. Хороший материал для того, чтобы начать изучать различные варианты обобщённого LR разбора. От классического варианта Томиты, до современных модификаций типа BRNGLR или RIGLR.
Что почитать по инкрементальному разбору
пока пусто
Чем отличаются лексический и синтаксический разбор?
пока пусто
Что использовать в качестве генераторов и комбинаторов для разных языков?
C/C++
Комментарий от @ksromanov.
- flex/bison — классическая связка генераторов лексического и синтаксического разбора. Работают с форматами lex/yacc соответственно. Не очень удобны для разработки парсеров, т.к. теряют типы при передаче в основную программу, но зато обладают феноменальной обратной совместимостью — написал и забыл. Можно быть уверенным, что написанная и отлаженная грамматика не потребует поддержки лет 20.
OCaml
Комментарий от @ksromanov.
-
ocamllex/Menhir — современная свзяка генераторов лексического и синтаксического разбора. Menhir по всем параметрам превосходит ocamlyacc, у него были несовместимые изменения, но давно.
-
ocamllex/ocamlyacc — классическая связка генераторов лексического и синтаксического разбора, аналогичная flex/bison, не теряет типы при передаче в основную программу. Аналогично flex/bison поддерживает совместимость. Увы, ocamlyacc устарел и постепенно меняется на Menhir.
Грамматику, разработанную на ocamllex/ocamlyacc очень легко портировать на flex/bison, поэтому OCaml с этой связкой можно использовать для прототипирования.
- angstrom — популярная библиотека комбинаторов.
Haskell
Комментарий от @ksromanov.
-
alex/happy — связка генераторов, используется в GHC, поэтому можно более-менее надеяться на стабильность.
-
parsec — классическая библиотека комбинаторов. Удобна и проста в использовании. По её мотивам написаны megaparsec, attoparsec и пр.
Универсальные генераторы
Комментарий от @ksromanov.
-
ANTLR4 — универсальный инструмент: реализует и лексический, и синтаксический разбор, поддерживает очень широкий спектр возможностей по заданию грамматики и семантических действий, имеет несколько бэкендов для генерации кода на разных языках, может генерировать как традиционную CST + Visitor, так и событийно-ориентированную инфраструктуру, используется в ряде промышленных проектов. Сообщество пользователей ANTLR поддерживает довольно обширный репозиторий грамматик.
-
BNFC — универсальный инструмент схожий с ANTLR4, поддерживает языки Haskell, Agda, C, C++, Java, Ocaml.