Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP parser на Golang

PHP parser на Golang

Iskander (Alex) Sharipov

September 26, 2020
Tweet

More Decks by Iskander (Alex) Sharipov

Other Decks in Programming

Transcript

  1. Для чего нужен парсер, какие проблемы решает? • Статический анализ

    phpstan/phpstan, vimeo/psalm, phan/phan • Поиск с учетом синтаксиса quasilyte/phpgrep • Рефакторинг wata727/pahout • Форматирование FriendsOfPHP/PHP-CS-Fixer • Сбор метрик phpmetrics/PhpMetrics • Построение графа вызовов
  2. Как решается задача в golang • AST - Абстрактное синтаксическое

    дерево • Golex - порт flex утилиты генератора лексического анализатора ◦ использует регулярные выражения для описания лексических правил • GoYacc - порт yacc утилиты генератора синтаксического анализатора ◦ Использует BNF для описания синтаксических правил • Ragel - генератор конечных автоматов и лексических анализаторов
  3. Оптимизация • Большое кол-во ссылок нагружает GC • Ссылки практически

    гарантированно выделяются в heap • Компилятор генерирует дополнительные проверки когда разыменовывает указатель чтобы убедиться что указатель не nil • Ссылки обычно имеют плохую locality of reference
  4. Шаблонные строки "str $a[$b.$c] str" 'str ' T_ENCAPSED_AND_WHITESPACE '$a' T_VARIABLE

    '[' '$b' T_VARIABLE '.' '$c' T_VARIABLE ']' ' str' T_ENCAPSED_AND_WHITESPACE
  5. Шаблонные строки "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 ']'