Подтвердить что ты не робот

Lex и Yacc в PHP

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

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

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

4b9b3361

Ответ 2

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

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

Ответ 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-данные взаимозаменяемы.