Подтвердить что ты не робот

Примеры парсеров, чтобы узнать, как их писать

Недавно я закончил курс компилятора в своем университете, но я чувствую укус ненасытным. Вот почему я ищу исходные коды парсеров и/или генераторов парсеров, которые можно было бы изучить, чтобы еще больше развивать мои навыки, которые я приобрел во время школьного курса. Знаете ли вы какие-либо рекомендуемые парсеры любого типа?

4b9b3361

Ответ 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 и заглянул в исходный код эта очень маленькая библиотека действительно помогла мне понять, что они собой представляют.