Lex и Yacc в PHP

Есть ли реализация Lex и Yacc в PHP?

Если нет, может ли кто-нибудь предложить лексический анализатор и генератор синтаксического анализатора (то есть, что-то вроде Lex и Yacc), которые создадут PHP-код. Я не слишком беспокоюсь о производительности полученного парсера.

Мне больно использовать регулярное выражение для анализа вещей, которые на самом деле не должны анализироваться регулярным выражением …

Там JLexPHP: https://github.com/wez/JLexPHP/blob/master/jlex.php

Я не использовал его, но есть следующее: http://pear.php.net/package/PHP_ParserGenerator , который создает PHP-парсер из грамматики Lemon . Однако проект кажется неактивным.

Я также нашел этот проект: http://code.google.com/p/antlrphpruntime/ , который использует Antlr . Опять неактивен.

На какое-то время искал такого рода вещи. После того, как я нашел этот пост, я попробовал запустить ANTLR PHP. Я могу сообщить, что это далеко не закончено. В сгенерированном коде есть несколько ошибок, в которых исходные классы Java-среды выполнения не были должным образом переведены на PHP (вложенные объявления классов, используя «.» Вместо «.» При попытке доступа к оператору методов класса).

Сама структура ANTLR достаточно мощная (не может свидетельствовать об эффективности сгенерированного кода). Особенно графический инструмент ANTLRWorks позволяет легко создавать и отлаживать граммы. Слишком плохо о версии PHP. Однако можно катить свое. Лучшим решением может быть анализ созданного класса времени выполнения ANTLR, выяснение того, как он работает, и придумать его меньшую версию предприятия.

Дешевый трюк: код рекурсивного синтаксического анализа. Это будет охватывать множество случаев. См. Есть ли альтернатива для flex / bison, которая может использоваться в 8-битных встроенных системах?

Еще одно утверждение: избегайте подхода Lex / Yacc, используйте PHP как хороший синтаксический анализатор строк ,

  • для простых задач и простых переводчиков: используйте perl-регулярные выражения (PCRE), с PHP preg_* функциями . Обратный вызов имеет ту же силу правил Awk или Yacc, но с кодом PHP (!).

  • для сложных задач : перевести (с помощью PHP-строки или переводчика PCRE или другого переводчика) ваш язык на диалект XML, процесс с DOM и / или XSLT . XSLT является «ориентированным на правило» (se xsl: template), например Yacc. С XSLT вы также имеете доступ к функциям PHP с помощью registerphpfunctions () . Если потребуется вернуться к языку, отличному от XML, или сложному формату ввода-вывода, снова обработать вывод ( сохраненный XML или XSLT-вывод) с помощью функций PCRE и строковых функций.

    • PS: для более богатых и сложных языков задача «перевод в XML» возможна (см. Теорию xSugar ), но не всегда легко. Вы можете использовать PHP-PEG для перевода с помощью PHP, или вы можете переводить с помощью внешнего инструмента , для кэширования XML или для использования версии ваших скриптов с определенным языком.

Эти два варианта имеют одинаковую (Lex и Yacc) мощность и используют только встроенные PHP-классы и функции.

Для сложных случаев помните, что XML, XSLT и т. Д. Являются стандартами W3C, тогда XML-диалекты являются «стандартными форматами», XML-инструменты оптимизированы и все еще развиваются, а XML-данные взаимозаменяемы.