Lex и Yacc в PHP
Есть ли реализация Lex и Yacc в PHP?
Если нет, может ли кто-нибудь предложить лексический анализатор и генератор синтаксического анализатора (то есть, что-то вроде Lex и Yacc), которые создадут PHP-код. Я не слишком беспокоюсь о производительности полученного парсера.
Мне больно использовать регулярное выражение для анализа вещей, которые действительно не должны анализироваться с помощью регулярного выражения...
Ответы
Ответ 1
Там JLexPHP: https://github.com/wez/JLexPHP/blob/master/jlex.php
Я не использовал его, но вот это: http://pear.php.net/package/PHP_ParserGenerator, который создает PHP Parser из Lemon. Проект кажется неактивным, хотя.
Я также нашел этот проект: http://code.google.com/p/antlrphpruntime/, в котором используется Antlr. Еще раз неактивен.
Ответ 2
Я искал такого рода вещи на некоторое время. После того, как я нашел этот пост, я попробовал запустить ANTLR PHP. Я могу сообщить, что это далеко не закончено. В сгенерированном коде есть несколько ошибок, в которых исходные классы Java-среды выполнения не были должным образом переведены на PHP (вложенные объявления классов, используя "." Вместо "." При попытке доступа к оператору методов класса).
Сама структура ANTLR достаточно мощная (не может свидетельствовать об эффективности сгенерированного кода).
Особенно графический инструмент ANTLRWorks позволяет легко создавать и отлаживать граммы. Слишком плохо о версии PHP. Возможно, вы можете катиться самостоятельно. Лучшее решение может состоять в анализе созданного класса времени выполнения ANTLR, выяснении того, как оно работает, и придумать более легкую версию с меньшим объемом бизнеса.
Ответ 3
Дешевый трюк: код рекурсивного синтаксического анализа. Это будет охватывать множество случаев. Видеть
Есть ли альтернатива для flex/bison, которая может использоваться в 8-битных встроенных системах?
Ответ 4
Еще одно предложение: избегайте подхода Lex/Yacc, используйте PHP как хороший string парсер,
-
для простых задач и простых переводчиков: используйте 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 или для использования версии с вашими языковыми скриптами с постоянным xml-текстом.
Эти два параметра имеют одинаковую (Lex и Yacc) мощность и используют только встроенные классы и функции PHP.
В сложных случаях помните, что XML, XSLT и т.д. являются стандартами W3C, тогда XML-диалекты являются "стандартными форматами", XML-инструменты оптимизированы и все еще развиваются, а XML-данные взаимозаменяемы.