Что такое хороший генератор парсера для php?
Мне нужно разобрать небольшой "мини-язык", который пользователи могут вводить на моем сайте. Мне было интересно, что аналоги из lex и jacc или antlr для мира php.
Ответы
Ответ 1
Я использовал LIME Parser generator для PHP пару лет назад, и он уже был зрелым и стабильным.
Сам синтаксический анализатор написан на PHP, что не имеет никакого значения в каком-либо техническом смысле - поскольку мы требуем только того, чтобы сгенерированный парсер был в PHP, но тем не менее мне нравится эта деталь. Это заставляет меня чувствовать себя менее извиняющимся в написании программного обеспечения на PHP, -)
EDIT:
Я должен добавить:
-
Где я писал "использовал", было бы более точно сказать, что я "играл". Я еще не написал никакого производственного кода, используя известь. Но я не вижу причин не делать этого.
-
В "примере калькулятора", снабженном лаймом, используется метод tokenize(), который очень далек от реальной замены мощности lex. Но если вам нужен реальный токенизатор, следует использовать lex на "переднем конце" для подачи токенов на изгиб на "заднем конце".
Ответ 2
http://pear.php.net/package/PHP_ParserGenerator
http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php
Ответ 3
Я портировал Jison, клон Bison в javascript, на php. Результатом является синтаксический анализатор, способный обрабатывать очень простой и очень сложный лексинг/синтаксический анализ. Сейчас это часть Jison, но в моей вилке есть несколько обновлений - https://github.com/robertleeplummerjr/jison. Файлы здесь - https://github.com/robertleeplummerjr/jison/tree/master/ports/php
См. readme на этой странице, вы одновременно создаете парсер javascript и php, которые способны выполнять одни и те же или разные вещи. COOL!
Ответ 4
Я советую вам написать собственный синтаксический анализатор, поскольку сегодня очень легко.
Самый простой способ сделать это, по-моему, создать один класс для каждого типа синтаксиса (выражение, тест, цикл и т.д.).
Затем в каждом классе введите следующие методы:
- один метод для определения из строки, если строка имеет данный тип (
a+b
имеет тип "выражение", if(b)
нет)
- один метод для запуска этого типа (
a+b
вернет a->run() + b->run()
, а a->run()
вернет значение)