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

PHP parser на Golang

PHP parser на Golang

5b8d20aa7d63c5d391b1c881e1764460?s=128

Iskander (Alex) Sharipov

September 26, 2020
Tweet

Transcript

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

  2. Вадим Слизов 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
  3. Для чего нужен парсер, какие проблемы решает? • Статический анализ

    phpstan/phpstan, vimeo/psalm, phan/phan • Поиск с учетом синтаксиса quasilyte/phpgrep • Рефакторинг wata727/pahout • Форматирование FriendsOfPHP/PHP-CS-Fixer • Сбор метрик phpmetrics/PhpMetrics • Построение графа вызовов
  4. Зачем еще один парсер? • Nikic/PHP-Parser + Ircmaxell/php-cfg • Microsoft/tolerant-php-parser

    • PHP-AST Extension • Golang PHP-parser
  5. Как решается задача в golang • AST - Абстрактное синтаксическое

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

    гарантированно выделяются в heap • Компилятор генерирует дополнительные проверки когда разыменовывает указатель чтобы убедиться что указатель не nil • Ссылки обычно имеют плохую locality of reference
  8. Оптимизация

  9. Оптимизация

  10. Free floating tokens

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

    '[' '$b' T_VARIABLE '.' '$c' T_VARIABLE ']' ' str' T_ENCAPSED_AND_WHITESPACE
  12. Шаблонные строки "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 ']'
  13. Планы • Закончить рефакторинг • Поддержка PHP 8 • CFG/SSA

    • Стабилизация API • Документация