библиотека для преобразования дерева узлов

Я хотел бы иметь возможность выразить общее преобразование одного дерева в другое без написания кучи повторяющегося спагетти-кода. Есть ли библиотеки, которые помогут решить эту проблему? Мой целевой язык - Python, но я рассмотрю и другие языки, если их можно перенести на Python.

Пример: Я хотел бы преобразовать это дерево узлов: (прошу прощения за S-выражения)

(A (B) (C) (D))

в следующее:

(C (B) (D))

При условии, что родителем является A, а вторым предком - C, независимо от контекста (родителей или предков может быть больше). Я хотел бы выразить это преобразование простым, лаконичным и пригодным для повторного использования способом. Конечно, этот пример очень специфичен. Пожалуйста, попробуйте рассмотреть общий случай.

Edit: RefactoringNG - это то, что я ищу, хотя он вводит совершенно новую грамматику для решения проблемы, чего я хотел бы избежать. Я все еще ищу больше и/или лучшие примеры.


Предыстория:

Я умею преобразовывать файлы python и cheetah (не спрашивайте!) в токенизированные представления деревьев, и, в свою очередь, преобразовывать их в lxml деревья. Затем я планирую реорганизовать дерево и записать результаты, чтобы реализовать автоматизированный рефакторинг. XSLT кажется стандартным инструментом для переписывания XML, но его синтаксис ужасен (на мой взгляд, конечно), и никто в нашем магазине его не поймет.

Я мог бы написать несколько функций, которые просто используют методы lxml (.xpath и подобные) для реализации моих рефакторингов, но я беспокоюсь, что в итоге у меня получится куча специально созданного спагетти-кода, который нельзя будет использовать повторно.

8
задан bukzor 19 January 2012 в 22:41
поделиться