Подготовлен (https://github.com/z7zmey/php-parser/releases/tag/v0.5.0) новый выпуск php-parser (https://github.com/z7zmey/php-parser), библиотеки для синтаксического разбора исходного кода на языке PHP в абстрактное синтаксическое дерево. Полностью поддерживается синтаксис PHP 5 и PHP 7, включая разбор пространств имён
и возможность обработки PHP-файлов с некорректным синтаксисом. Проект может использоваться для создания статических анализаторов, утилит рефакторинга и сбора метрик. Код проекта написан на языке Go c использованием библиотек goyacc (https://godoc.org/golang.org/x/tools/cmd/goyacc) и golex (https://github.com/cznic/golex), и распространяется (https://github.com/z7zmey/php-parser) под лиценизей MIT.URL: https://github.com/z7zmey/php-parser/releases/tag/v0.5.0
Новость: https://www.opennet.me/opennews/art.shtml?num=48739
Парсер пхп на go? Надо было на js делать для полноты картины
Тогда уж на пхп
парсер на PHP уже написан и встроен в PHP
http://php.net/manual/ru/function.token-get-all.php
https://github.com/nikic/PHP-Parserне благодарите
для чего вам хватит? Оно же ни в неймспейсы, ни даже в классы не умеет.
а мне и на сях хватит:
https://github.com/universal-ctags/ctags/blob/master/parsers...
А чем оно лучше nikic/PHP-Parser. Парсера php на php от одного из ключевых разработчиков самого php?
Это полный аналог nikic/PHP-Parser только на Go. Ну и еще он немного быстре, по моим замерам приблизительно в 5 раз.
personal home parser
> возможность обработки PHP-файлов с некорректным синтаксисом.Приличный парсер при обнаружении некорректного синтаксиса должен ругнуться и вылететь. Но не в случае с PHP.
для PHP парсер с такой логикой пишется в три строчки...
Ты не прав, для реадкторов/IDE для любого ЯП это краегоульная фича
собрался выполнять код при помощи подсвечивалки синтаксиса?
> собрался выполнять код при помощи подсвечивалки синтаксиса?Вы очевидно не поняли назначение данной библиотеки. Она не нацелена на исполнение кода. Основное назначение - перевод текстового представления исходников в пригодный для машинной обработки AST. Это как раз нужно для создания IDE, статических анализаторов, утилит автоматизированого рефакторинга либо для сбора метрик.
приведи мне IDE, написанную на шаблонизаторе "персонал хоум пейджь"
Ты не понял нифига.Не IDE на PHP, а IDE для PHP.
Вот запускаешь тот же PHPStorm, пишешь невалидный PHP-код, он красненьким подсвечивается. Понятно теперь?
а, все, теперь понял. Звиняйте, пацаны. Я опорочил имя Аноним
> приведи мне IDE, написанную на шаблонизаторе "персонал хоум пейджь"https://github.com/felixfbecker/php-language-server реализует функции IDE для VSCode. А под капотом использует https://github.com/microsoft/tolerant-php-parser который, между прочим, тоже написан на PHP.
а как насчет конвертации полученого AST в go исходники?
> а как насчет конвертации полученого AST в go исходники?В стандартной библиотеки Go присутствует пакет AST и его можно использовать для генерации Go исходников. Самое сложное это сконвертировать абстрактное дерево PHP в абстрактное дерево Go.
Cтруктура этих языков очень разная, и я склонен верить что это практически нереализуемая задача.
Почему не реализуемая. Практическую ценность будет иметь продукт, который 90% кода переведет (вполне реально), а 10% снабдит каментом "не шмагла" и оставит как есть. Экономия времени все равно будет нехилая.
> а как насчет конвертации полученого AST в go исходники?Это невозможно. Даже если выбросить eval() и подобное, что делать с нестрогой динамической типизацией?
Субсет. У FB было параллельно с LLVM, не помню, как называлось.
У FB субсет был недолго, из него получился свой язык Hack, который, хоть и похож на PHP, но совсем не PHP.Для проекта, который на субсете пишется по определенным правилам, это, конечно, возможно. Но смысла в этом не наблюдаю: существующий сколь-либо крупный проект на сабсет вменяемыми усилиями не переделать. А если писать новый проект - если нужна нормальная типизация и компиляция в нативный код, зачем его вообще писать на PHP, тем более, что ни один фреймворк под такие требования не подойдет?
А на чем тогда писать?