Недавно я закончил курс компилятора в своем университете, но я чувствую укус ненасытным. Вот почему я ищу исходные коды парсеров и/или генераторов парсеров, которые можно было бы изучить, чтобы еще больше развивать мои навыки, которые я приобрел во время школьного курса. Знаете ли вы какие-либо рекомендуемые парсеры любого типа?
Примеры парсеров, чтобы узнать, как их писать
Ответ 1
Вы должны знать, как вручную создавать рекурсивные партизаны. Здесь SO-ссылка на быстрый урок о том, как это сделать: fooobar.com/questions/79055/...
Если вы хотите понять, как рекурсивные парсеры спуска могут быть построено автоматически, вы можете прочитать документ (и см. учебник) по MetaII по этой ссылке: fooobar.com/questions/159427/...
Ответ 2
- Bison является классическим примером (C/С++).
- Pyparsing - отличный модуль, и он очень прост в использовании (Python).
- Lemon очень прост в использовании (С++).
Проверьте примеры и удачи.
Edit:
Думаю, я должен прокомментировать. A parser
- это программа, которая обрабатывает ввод и "понимает" его. A parser generator
- инструмент, используемый для написания парсеров. Думаю, вы хотите узнать больше о создании парсеров, и в этом случае вы должны обратиться к документации генераторов парсеров (все выше).
Ответ 3
Сами парсеры обычно не так интересны, это генераторы парсеров, которые больше изучаются.
- ANTLR генерирует LL-парсеры, которые легко читаются после создания. (Java)
- Bison генерирует парсер LALR (1), которые невозможно прочитать. (С)
Если LALR (1) вас интересует, у меня есть библиотека на github, которая пытается сделать новый номер при разборе LALR. Не стесняйтесь смотреть. Это в С#, и я попытался сделать все, чтобы сделать код понятным. Это был учебный проект для меня, но он меньше, чем большие инструменты и немного легче проникать. И определенно не стесняйтесь вносить свой вклад, много возможностей добавить еще.
В противном случае взгляните на сгенерированный код этих инструментов, чтобы увидеть, как они создают фактические парсеры, которые выполняют работу.
Ответ 4
Я бы предложил вам эту книгу: http://www.cs.nott.ac.uk/~gmh/book.html. неплохо запустить Haskell, и у него есть целая глава о парсерах.
Если вы можете понять, что создание парсера с использованием Haskell довольно прямолинейно. Учитывайте также, что Haskell довольно быстр и хорош для многоядерного программирования, поэтому это может быть будущее.
Plus.
Вот синтаксический анализатор в Haskell: Happy - http://www.haskell.org/happy/.
Ответ 5
Я просто пережил те же битвы и, наконец, почувствовал, что у меня есть хорошая ручка в ваших вариантах.
Множество парсеров построено для контекстно-свободных грамматик. Вы можете прочитать формальное определение контекстно-бесплатного, но моя интуиция заключается в том, что в основном это означает, что синтаксические токены/правила не могут меняться в зависимости от какого-то контекста. Я мог ошибаться в этом, но я думаю, что это также означает, что у вас нет надежды на будущее.
Например, уценка не является контекстно-зависимой, и я думаю, что любой язык, основанный на отступе, не является контекстным, без необходимости выполнять некоторую предварительную обработку для блокировки блоков с помощью токенов начала и конца. C - прекрасный пример контекстно-свободной грамматики.
Если вы имеете дело с контекстно-свободной грамматикой, BNF является формальным способом указания компилятора. Это была очень полезная статья, объясняющая, как работают грамматики BNF, как они работают, и общие расширения к грамматикам BNF.
Некоторые из ваших опций в этой категории: ANTLR, Bison, Yacc, Jison и Peg.js.
Однако, после битвы против ANTLR на некоторое время, я нашел то, что я считаю лучшим решением: "Компараторы парсера". Его в основном регулярное выражение на стероидах и очень популярно в мире функционального программирования.
У меня пока нет хороших учебных ресурсов, но Google вокруг, и вы найдете их практически на любом языке. Я пришел из мира JavaScript и заглянул в исходный код эта очень маленькая библиотека действительно помогла мне понять, что они собой представляют.