Наш набор инструментов для реинжиниринга программного обеспечения DMS, скорее всего, поможет реализовать ваше решение. Он предназначен для выполнения надежных преобразований исходного кода с использованием преобразований AST в AST, закодированных в терминах поверхностного синтаксиса.
Он имеет интерфейс PHP, который представляет собой полный и точный анализатор PHP, AST билдер и регенератор AST в PHP-код. DMS обеспечивает красивую печать AST или точную печать («сохранение номеров столбцов, где это возможно»).
Эта комбинация использовалась для реализации различных надежных инструментов обработки исходного кода 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").
Правило работает путем абстрактной идентификации деревьев, соответствующих языковым нетерминалам (в данном случае «путь_пространства_имен»), и замены простых деревьев более сложными деревьями, которые представляют полный путь пространства имен. Правило записывается в виде текста, но само правило анализируется. с помощью DMS для построения деревьев, необходимых для соответствия деревьям PHP.
Логика применения правила DMS может тривиально применять это правило во всем AST, созданном синтаксическим анализатором PHP.
Этот ответ может показаться слишком простым перед лицом всех сложных вещей, составляющих язык PHP, но вся эта сложность скрыта в определении языка PHP, используемом DMS; это определение состоит примерно из 10 000 строк лексических и грамматических определений, но оно уже протестировано и работает. Весь механизм DMS и эти 10 тысяч строк указывают на то, что простые регулярные выражения не могут надежно выполнять свою работу. (Удивительно, сколько машин требуется, чтобы сделать это правильно; я работаю над DMS с 1995 года).
Если вы хотите увидеть все механизмы, которые составляют то, как DMS определяет язык или управляет им, вы можете см. хороший простой пример.
person
Ira Baxter
schedule
07.09.2010