В настоящее время я создаю PHP-парсер, написанный на PHP, поскольку в предыдущем вопросе мой предыдущий вопрос не появился уже существующий парсер. Параметр работает достаточно хорошо.
Теперь очевидно, что синтаксический анализатор сам по себе мало пользы (помимо статического анализа). Я хотел бы применить преобразования к AST, а затем скомпилировать его обратно в исходный код. Применение преобразований не является проблемой, обычно должен выглядеть обычный шаблон посетителя.
В настоящее время моя проблема заключается в том, как скомпилировать AST в исходный код. В основном я вижу две возможности:
- Скомпилируйте код с помощью некоторой предопределенной схемы
- Сохраните форматирование исходного кода и примените 1. только к измененным узлам.
На данный момент я хотел бы сосредоточиться на 1. как 2. Кажется довольно сложно выполнить (но если у вас есть советы по этому поводу, я бы хотел их услышать).
Но я не уверен, какой шаблон дизайна можно использовать для компиляции кода. Самый простой способ реализовать это - добавить метод ->compile
ко всем узлам. Недостаток, который я вижу здесь, заключается в том, что было бы довольно сложно изменить форматирование сгенерированного вывода. Для этого нужно будет изменить сами узлы. Таким образом, я ищу другое решение.
Я слышал, что шаблон Visitor можно использовать и для этого, но я не могу представить, как это должно работать. Поскольку я понимаю шаблон посетителя, у вас есть некоторая NodeTraverser
, которая повторяется рекурсивно по всем узлам и вызывает метод ->visit
для Visitor
. Это звучит довольно многообещающе для манипуляции node, где метод Visitor->visit
может просто изменить node, который был передан, но я не знаю, как его можно использовать для компиляции. Очевидной идеей было бы итерации дерева node от листьев до корня и замены посещенных узлов исходным кодом. Но это как-то не кажется очень чистым решением?