Lex и Yacc в PHP [закрыто]
есть ли реализация Lex и Yacc в PHP?
Если нет, Может ли кто-нибудь предложить лексический анализатор и генератор парсеров (т. е. что-нибудь вроде Lex и Yacc), который создаст PHP-код. Я не слишком беспокоюсь о производительности полученного парсера.
Мне надоело использовать регулярное выражение для анализа вещей, которые действительно не следует анализировать с регулярным выражением...
4 ответов
есть JLexPHP:https://github.com/wez/JLexPHP/blob/master/jlex.php
Я не использовал его, но есть это:http://pear.php.net/package/PHP_ParserGenerator, который создает парсер PHP из лимон грамматика. Однако проект, похоже, неактивен.
Я также нашел этот проект:http://code.google.com/p/antlrphpruntime/, который использует Antlr. Однако снова неактивен.
был для поиска такого рода вещей на некоторое время. Найдя этот пост, я попробовал среду выполнения ANTLR PHP. Я могу доложить, что она еще далека от завершения. Существует несколько ошибок в сгенерированном коде, где исходные классы Java runtime не были должным образом переведены на PHP (вложенные объявления классов, используя '."вместо ".'при попытке доступа к оператору методов класса).
сама структура ANTLR довольно мощная (не может подтвердить эффективность сгенерированный код.) Особенно графический инструмент ANTLRWorks позволяет легко создавать и отлаживать граммы. Очень плохо о версии PHP. Хотя можно свернуть свой собственный. Лучшим решением может быть анализ сгенерированного класса ANTLR runtime, выяснить, как он работает, и придумать его облегченную менее предприимчивую версию.
дешевый трюк: код рекурсивного анализатора спуска. Это покроет много дел. Видеть есть ли альтернатива для flex / bison, которая может использоваться в 8-битных встроенных системах?
другой sugestion: избегайте подхода Lex/Yacc, используйте PHP как хороший строка парсер,
для простых задач и простые переводчики: используйте Perl-регулярные выражения (PCRE), с PHP
preg_*
функции. Обратный вызов имеет ту же силу Правил Awk или Yacc, но с кодом PHP (!).-
для сложных задач: translate (с помощью 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-данные взаимозаменяемы.