Slide 1

Slide 1 text

PHP Parser на Golang Что, как, зачем и почему?

Slide 2

Slide 2 text

Вадим Слизов Email: z7zmey@gmail.com Linkedin: https://www.linkedin.com/in/z7zmey/ Twitter: https://twitter.com/z7zmey GitHub: https://github.com/z7zmey php-parser: https://github.com/z7zmey/php-parser

Slide 3

Slide 3 text

Для чего нужен парсер, какие проблемы решает? ● Статический анализ phpstan/phpstan, vimeo/psalm, phan/phan ● Поиск с учетом синтаксиса quasilyte/phpgrep ● Рефакторинг wata727/pahout ● Форматирование FriendsOfPHP/PHP-CS-Fixer ● Сбор метрик phpmetrics/PhpMetrics ● Построение графа вызовов

Slide 4

Slide 4 text

Зачем еще один парсер? ● Nikic/PHP-Parser + Ircmaxell/php-cfg ● Microsoft/tolerant-php-parser ● PHP-AST Extension ● Golang PHP-parser

Slide 5

Slide 5 text

Как решается задача в golang ● AST - Абстрактное синтаксическое дерево ● Golex - порт flex утилиты генератора лексического анализатора ○ использует регулярные выражения для описания лексических правил ● GoYacc - порт yacc утилиты генератора синтаксического анализатора ○ Использует BNF для описания синтаксических правил ● Ragel - генератор конечных автоматов и лексических анализаторов

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Оптимизация ● Большое кол-во ссылок нагружает GC ● Ссылки практически гарантированно выделяются в heap ● Компилятор генерирует дополнительные проверки когда разыменовывает указатель чтобы убедиться что указатель не nil ● Ссылки обычно имеют плохую locality of reference

Slide 8

Slide 8 text

Оптимизация

Slide 9

Slide 9 text

Оптимизация

Slide 10

Slide 10 text

Free floating tokens

Slide 11

Slide 11 text

Шаблонные строки "str $a[$b.$c] str" 'str ' T_ENCAPSED_AND_WHITESPACE '$a' T_VARIABLE '[' '$b' T_VARIABLE '.' '$c' T_VARIABLE ']' ' str' T_ENCAPSED_AND_WHITESPACE

Slide 12

Slide 12 text

Шаблонные строки "str $a[$b . $c] str" 'str ' T_ENCAPSED_AND_WHITESPACE '$a' T_VARIABLE '[' '$b' T_VARIABLE '' T_ENCAPSED_AND_WHITESPACE ' . ' T_ENCAPSED_AND_WHITESPACE '$c' T_VARIABLE '] str' T_ENCAPSED_AND_WHITESPACE PHP Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting ']'

Slide 13

Slide 13 text

Планы ● Закончить рефакторинг ● Поддержка PHP 8 ● CFG/SSA ● Стабилизация API ● Документация