Я хотел бы иметь возможность выразить общее преобразование одного дерева в другое без написания кучи повторяющегося спагетти-кода. Есть ли библиотеки, которые помогут решить эту проблему? Мой целевой язык - Python, но я рассмотрю и другие языки, если их можно перенести на Python.
Пример: Я хотел бы преобразовать это дерево узлов: (прошу прощения за S-выражения)
(A (B) (C) (D))
в следующее:
(C (B) (D))
При условии, что родителем является A, а вторым предком - C, независимо от контекста (родителей или предков может быть больше). Я хотел бы выразить это преобразование простым, лаконичным и пригодным для повторного использования способом. Конечно, этот пример очень специфичен. Пожалуйста, попробуйте рассмотреть общий случай.
Edit: RefactoringNG - это то, что я ищу, хотя он вводит совершенно новую грамматику для решения проблемы, чего я хотел бы избежать. Я все еще ищу больше и/или лучшие примеры.
Предыстория:
Я умею преобразовывать файлы python и cheetah (не спрашивайте!) в токенизированные представления деревьев, и, в свою очередь, преобразовывать их в lxml деревья. Затем я планирую реорганизовать дерево и записать результаты, чтобы реализовать автоматизированный рефакторинг. XSLT кажется стандартным инструментом для переписывания XML, но его синтаксис ужасен (на мой взгляд, конечно), и никто в нашем магазине его не поймет.
Я мог бы написать несколько функций, которые просто используют методы lxml (.xpath и подобные) для реализации моих рефакторингов, но я беспокоюсь, что в итоге у меня получится куча специально созданного спагетти-кода, который нельзя будет использовать повторно.