Наш инструментарий реинжиниринга программного обеспечения DMS , вероятно, может реализовать ваше решение довольно хорошо. Он предназначен для выполнения надежных преобразований исходного кода с использованием преобразований AST в AST, закодированных в терминах поверхностного синтаксиса.
Имеет PHP Front End , который является полным, точным парсером PHP, сборщиком AST и AST to PHP-регенератором кода. DMS обеспечивает печать AST prettyprinting или fidelity («сохраняйте номера столбцов, где это возможно»).
Эта комбинация использовалась для реализации множества надежных инструментов манипулирования исходным кодом PHP для PHP 4 и 5.
РЕДАКТИРОВАТЬ (в ответ на несколько недоверчивый комментарий):
Для решения OP большая часть работы должна выполняться следующим правилом преобразования DMS:
rule replace_underscored_identifier_with_namespace_path(namespace_path:N)
:namespace_path->namespace_path
"\N" -> "\complex_namespace_path\(\N\)"
if N=="NCLASS_OR_NAMESPACE_IDENTIFIER" && has_underscores(N);
Это правило находит все «простые» идентификаторы, которые используются там, где разрешены пути к пространствам имен,
и заменяет эти простые идентификаторы на соответствующий путь к пространству имен
разрывая строку для идентификатора на отдельные элементы, разделенные подчеркиванием. Нужно кодировать некоторую процедурную помощь
в языке реализации DMS, PARLANSE, для проверки того, что идентификатор содержит символы подчеркивания ("has_underscores"), и для реализации логики разрыва на части путем создания соответствующего поддерева пути пространства имен ("complex_namespace_path").
Правило работает путем абстрактной идентификации деревьев, которые соответствуют языковым нетерминалам (в данном случае «namespace_path»), и замены простых деревьев более сложными деревьями, представляющими полный путь к пространству имен. Сам DMS анализируется для построения деревьев, необходимых для соответствия деревьям PHP.
Логика приложения правил DMS может тривиально применять это правило повсюду в AST, создаваемом синтаксическим анализатором PHP.
Этот ответ может показаться слишком простым перед лицом всех сложных вещей, составляющих язык PHP, но вся эта другая сложность скрыта в определении языка PHP, используемом DMS; это определение составляет около 10 000 строк лексических и грамматических определений, но уже протестировано и работает. Все механизмы DMS и эти 10K-строки являются признаками того, почему простые регулярные выражения не могут выполнять работу надежно. (Удивительно, сколько оборудования требуется, чтобы получить это право; я работаю над DMS с 1995 года.)
Если вы хотите увидеть все механизм, который определяет, как DMS определяет / манипулирует языком, вы можете увидеть хороший простой пример .