2010-01-19 5 views
30

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

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

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

+0

@nickf Хорошо заслуженный, хотя! – Christian

+0

+1 'preg_split ('# ([{}]) #', ...)' может только довести вас до сих пор. – Dan

+0

Возможно, вы захотите использовать buken-in PHP tokenizer, если ваш язык использует те же токены, что и PHP – niahoo

ответ

8

Там в 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. Опять неактивен.

1

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

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

0

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

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

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

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

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

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