Посты с тэгом парсер


[Перевод] Работа над PEG на Core Developer Sprint

В этой статье я не буду рассказывать о новых фичах генератора парсера — я достаточно описал его в предыдущих частях. Вместо этого хочу рассказать что я делал на Core Developer Sprint на прошлой неделе, прежде чем всё сотрётся из моей памяти. Хотя большая часть материала так или иначе всё равно касается PEG. Так что мне придётся показать некоторый код, который задаёт направление в реализации PEG-парсера для Python 3.9.




[Перевод] Реализация остальных возможностей PEG

После того, как я собрал все части генератора PEG-парсеров воедино в предыдущем посте, я готов показать как реализовать и некоторые другие интересные штуки.



Мы рассмотрим следующи



[Перевод] Мета-грамматика для PEG парсера

На этой неделе мы делаем генератор парсеров «самостоятельным», то есть он будет генерировать свой собственный парсер.



Итак, у нас уже есть генератор парсера, часть которого является парсером грамматики. Мы могли бы назвать это



[Перевод] Добавление экшенов в грамматику PEG

Грамматика становится ещё лучше, если вы можете добавить (некоторую) семантику в соответствии с правилами. В частности, для анализатора Python, который я разрабатываю, мне нужно возвращать узел AST из каждой альтернативы, поскольку я хочу придерживаться текущей реализации AST в CPython.


Содержание серии статей о PEG-парсере в Python


[Перевод] Леворекурсивные PEG грамматики

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


Содержание серии статей о PEG-парсере в Python

Рассмотрим это гипотетическое правило грамматики:


expr: expr '+' term | term


[Перевод] Визуализация работы PEG парсера

В прошлый раз получился простой генератор парсера PEG. Сейчас же я покажу, что на самом деле делает сгенерированный парсер при разборе программы. Я погрузился в ретро-мир ASCII-арта, в частности, библиотеку с именем «curses», которая доступна в стандартной поставке Python для Linux и Mac, а также как дополнение для Windows.


Содержание серии статей о PEG-парсере в Python


<В конце статьи под спойлером пр



[Перевод] Генерация PEG-парсера

Теперь, когда я набросал основу самописного парсера, давайте перейдём к генерации его методов из грамматики, как я и обещал. Также покажу как реализовать packrat-парсер с помощью декоратора @memoize.


Содержание серии статей о PEG-парсере в Python

В прошлый раз мы разобрали несколько методов парсера. С некоторыми ограничениями, которые мы снимем чуть позже, их легко генерировать из грамматики автоматически.



[Перевод] Реализация PEG парсера

Вдохновленный лишь частичным пониманием PEG, я решил попробовать его реализовать. Результат может получиться и не самым лучшим среди парсеров PEG общего назначения — их уже много (например, TatSu написан на Python и генерирует код Python) — но это хороший способ разобраться в PEG. В дальнейшем я хочу заменить им текущую реализацию парсера в CPython.


Содержание серии статей о PEG-парсере в Python
  • PEG парсеры
  • Реализация PEG парсера
  • Генерация PEG парсера
  • Визуализация работы PEG парсера
  • Леворекурсивные PEG грамматики
  • Добавление экшенов в грамматику PEG
  • Реализация остальных возможностей PEG
  • PEG на Core Developer Sprint

В этом разделе я закладываю основы для понимания работы парсера, на примере простой самописной реализации игрушечной грамматики из прошлой статьи.



[Перевод] PEG парсеры

Несколько лет назад меня кто-то спросил имеет ли смысл превести Python на PEG-парсер (или на грамматику PEG; я не помню точно кто и когда это было). Тогда я немного посмотрел на него, но так и не пришёл к какому-либо выводу, а потому и отбросил эту тему. Недавно я узнал больше о PEG (Parsing Expression Grammars, грамматике по парсингу выражений), и теперь я думаю, что это интересная альтернатива самописному генератору парсеров, который был разработан 30 лет назад, когда только начинал работать над Python. Я назвал его «pgen», и это был, наверно, первым фрагментом кода, который я написал для Python.


Содержание серии статей о PEG-парсере в Python
  • PEG парсеры
  • Реализация PEG парсера
  • Генерация PEG парсера
  • Визуализация работы PEG парсера
  • Леворекурсивные PEG грамматики
  • Добавление экшенов в грамматику PEG
  • Реализация остальных возможностей PEG
  • PEG на Core Developer Sprin


[Из песочницы] Простой интерпретатор с нуля на Python (часть 3)




Содержание
Простой интерпретатор с нуля на Python #1
Простой интерпретатор с нуля на Python #2
Простой интерпретатор с нуля на Python #3
Простой интерпретатор с нуля на Python #4

Разъяснение к публикации
Пользователь duse ранее выкладывал переводы двух предыдущих статей, явно намереваясь перевести всю серию. Так как тема меня очень интересует, а новых переводов нет, обратился к первоисточнику. С английским не очень силён, чтобы не терять суть, стал переводить на русский. Так и родился этот перевод. Прошу прощения у duse в случае, если мне стоило ещё чуточку потерпеть. Но для сообщества в любом случае должна быть польза.