[#] Как устроен парсер Python, и как втрое уменьшить потребление им памяти
habrabot(difrex,1) — All
2016-11-07 01:30:04


Любой, кто изучал устройство языков программирования, примерно представляет, как они работают: парсер в соответствии с формальной грамматикой ЯП превращает входной текст в некоторое древовидное представление, с которой работают последующие этапы (семантический анализ, различные трансформации, и генерация кода).



В Python всё немного сложнее: парсеров два. Первый парсер руководствуется грамматикой, заданной в файле `[Grammar/Grammar][1]` в виде регулярных выражений (с не совсем обычным синтаксисом). По этой грамматике при помощи `Parser/pgen` во время компиляции `python` генерируется целый набор [_конечных автоматов_][4], распознающих заданные регулярные выражения — по одному КА для каждого нетерминала. Формат получающегося набора КА описан в `[Include/grammar.h][5]`, а сами КА задаются в `[Python/graminit.c][8]`, в виде глобальной структуры `_PyParser_Grammar`. Терминальные символы определены в `[Include/token.h][11]`, и им соответствуют номера 0..56; номера нетерминалов начинаются с 256.

Проиллюстрировать работу первого парсера проще всего на примере.
Пусть у нас есть программа `if 42: print("Hello world")` [Читать дальше →][14]

[1]: https://hg.python.org/cpython/file/default/Grammar/Grammar
[2]: https://hg.python.org/cpython/file/default/Grammar/Grammar
[3]: https://hg.python.org/cpython/file/default/Grammar/Grammar
[4]: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82
[5]: https://hg.python.org/cpython/file/default/Include/grammar.h
[6]: https://hg.python.org/cpython/file/default/Include/grammar.h
[7]: https://hg.python.org/cpython/file/default/Include/grammar.h
[8]: https://hg.python.org/cpython/file/default/Python/graminit.c
[9]: https://hg.python.org/cpython/file/default/Python/graminit.c
[10]: https://hg.python.org/cpython/file/default/Python/graminit.c
[11]: https://hg.python.org/cpython/file/default/Include/token.h
[12]: https://hg.python.org/cpython/file/default/Include/token.h
[13]: https://hg.python.org/cpython/file/default/Include/token.h
[14]: https://habrahabr.ru/post/314062/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut