Это анализатор PHP ранней стадии, изначально разработанный для сценариев использования IDE (более подробную информацию см. в разделе «Цели разработки»). Предстоит еще много работы, поэтому на данный момент этот репозиторий по большей части служит экспериментом и началом разговора.
Это ветка v0.1, которая изменяет структуры данных для поддержки синтаксиса, добавленного после исходной строки выпуска 0.0.x.
После того, как вы настроили свой компьютер, вы можете использовать синтаксический анализатор для создания абстрактного синтаксического дерева (AST) и работы с ним через дружественный API.
<?php// Для автоматической загрузки необходимых классов требуется __DIR__ . "/vendor/autoload.php";use MicrosoftPhpParser{DiagnosticsProvider, Node, Parser, PositionUtilities};// Создать экземпляр нового экземпляра парсера $parser = new Parser();// Вернуть и распечатать AST из содержимого строки $astNode = $parser ->parseSourceFile('<?php /* комментарий */ echo "привет!"');var_dump($astNode);// Получает и печатает ошибки из AST Node. Анализатор корректно обрабатывает ошибки, // поэтому его можно использовать в сценариях использования IDE (где код часто является неполным). $errors = DiagnosticsProvider::getDiagnostics($astNode);var_dump($errors);// Обход всех потомков Node $astNodeforeach ($astNode->getDescendantNodes() как $descendant) {if ($descendant instanceof NodeStringLiteral) {// Распечатываем текст узла (без пробелов и комментариев)var_dump($descendant->getText());// Все узлы ссылаются на своих родителей, чтобы можно было легко перемещаться по дереву.$grandParent = $descendant- >getParent()->getParent();var_dump($grandParent->getNodeKindName());// AST является полностью репрезентативным, и возможность возврата к исходному источнику.// Это позволяет потребителям создавать надежные инструменты форматирования и рефакторинга.var_dump($grandParent->getLeadingCommentAndWhitespaceText()); }// В дополнение к извлечению всех дочерних элементов или потомков узла // Узлы предоставляют свойства, специфичные для типа узла. Чтобы сократить потребление памяти, позиции представлены в документе как один целочисленный индекс, но их позиции строк и символов легко получить.$lineCharacterPosition = PositionUtilities::getLineCharacterPositionFromPosition($echoKeywordStartPosition,$descendant->getFileContents() );echo "строка: $lineCharacterPosition->строка, символ: $lineCharacterPosition->символ"; } }
Примечание. API еще не доработан, поэтому при возникновении проблем с файлами сообщите нам, какие функции вы хотите предоставить, и мы посмотрим, что можно сделать! Также просьба сообщать обо всех ошибках с неожиданным поведением в дереве синтаксического анализа. Мы все еще находимся на ранней стадии разработки, и мы будем очень признательны за любые ваши отзывы.
Устойчивый к ошибкам дизайн — в сценариях IDE код по определению является неполным. В случае ввода неверного кода синтаксический анализатор все равно должен иметь возможность восстановить и создать действительное и полное дерево, а также соответствующую диагностику.
Быстрый и легкий (должен анализировать несколько МБ исходного кода в секунду, чтобы оставить место для других функций).
Структуры данных с эффективным использованием памяти
Разрешить инкрементный анализ в будущем
Соответствует спецификации языка PHP, поддерживает грамматики PHP5 и PHP7.
Сгенерированный AST предоставляет свойства (полностью репрезентативные и т. д.), необходимые для семантических и трансформационных операций, которые также должны быть производительными.
Полностью репрезентативный и допускающий возврат к тексту, из которого он был проанализирован (все пробелы и комментарии «мелочи» включены в дерево синтаксического анализа)
Можно легко перемещаться по дереву через родительские/дочерние узлы.
Время отклика пользовательского интерфейса < 100 мс, поэтому каждая операция языкового сервера должна составлять < 50 мс, чтобы оставить место для всех остальных процессов, происходящих параллельно.
Простота и удобство сопровождения с течением времени — парсеры имеют тенденцию становиться очень запутанными и очень быстрыми, поэтому читаемость и возможность отладки имеют высокий приоритет.
Тестируемость — анализатор должен создавать доказуемо валидные деревья разбора. Мы достигаем этого, определяя и постоянно проверяя набор инвариантов дерева.
Дружественный и описательный API, позволяющий другим легко использовать его.
Написано на PHP — максимально упростите для сообщества PHP использование и внесение вклада.
Чтобы обеспечить достаточный уровень корректности на каждом этапе пути, парсер разрабатывается с использованием следующего поэтапного подхода:
Этап 1. Напишите лексер, который не поддерживает грамматику PHP, но поддерживает EOF и неизвестные токены. Напишите тесты для всех инвариантов.
Этап 2: Поддержка лексической грамматики PHP, множество тестов.
Этап 3. Напишите синтаксический анализатор, который не поддерживает грамматику PHP, но создает дерево узлов ошибок. Напишите тесты для всех инвариантов.
Этап 4: Поддержка синтаксической грамматики PHP, множество тестов.
Этап 5 (в процессе): Проверка и оптимизация в реальных условиях.
Корректность: убедитесь, что в примерах кодовых баз нет ошибок, сравните их с другими парсерами (расследуйте любые случаи разногласий), нечеткое тестирование.
Производительность: профиль, сравнение с большими PHP-приложениями.
Этап 6: Завершить работу над API, чтобы сделать его использование максимально простым для людей.
Некоторые грамматические конструкции PHP (а именно выражение доходности и строки шаблона) еще не поддерживаются, а также существуют другие разные ошибки. Однако, поскольку синтаксический анализатор толерантен к ошибкам, эти ошибки корректно обрабатываются, и в остальном результирующее дерево является полным. Чтобы получить более целостное представление о том, где мы находимся, вы можете запустить набор «проверочных» тестов (дополнительную информацию о запуске тестов см. в разделе «Правила для участников»). Или просто взгляните на текущие результаты проверочных испытаний.
Несмотря на то, что мы еще не приступили к этапу оптимизации производительности, мы пока видим многообещающие результаты, и у нас есть еще много возможностей для улучшения. Подробности о нашем текущем подходе см. в разделе «Как это работает» и запустите тесты производительности на своем компьютере, чтобы убедиться в этом сами.
Цели дизайна — узнайте о целях дизайна проекта (функции, показатели производительности и т. д.).
Документация — узнайте, как ссылаться на парсер из вашего проекта и как выполнять операции с AST, чтобы отвечать на вопросы о вашем коде.
Инструмент Syntax Visualizer — получите более осязаемое представление о AST. Проявите творческий подход – посмотрите, сможете ли вы его сломать!
Текущий статус и подход : какая часть грамматики поддерживается? Производительность? Память? Стабильность API?
Как это работает — узнайте об архитектуре, дизайнерских решениях и компромиссах.
Лексер и Парсер
Стратегия толерантности к ошибкам
Инкрементный анализ
Открытые вопросы
Стратегия проверки
Способствовать! - узнайте, как принять участие, ознакомьтесь с некоторыми указателями на образовательные коммиты, которые помогут вам расширить базу кода (даже если вы никогда раньше не работали над парсером), а также рекомендуемые рабочие процессы, которые упрощают итерацию.
В этом проекте принят Кодекс поведения Microsoft с открытым исходным кодом. Для получения дополнительной информации см. часто задаваемые вопросы по Кодексу поведения или свяжитесь с нами по адресу [email protected], если у вас возникнут дополнительные вопросы или комментарии.