Есть ли реализация 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 и строковых функций.
Эти два варианта имеют одинаковую (Lex и Yacc) мощность и используют только встроенные PHP-классы и функции.
Для сложных случаев помните, что XML, XSLT и т. Д. Являются стандартами W3C, тогда XML-диалекты являются «стандартными форматами», XML-инструменты оптимизированы и все еще развиваются, а XML-данные взаимозаменяемы.