È possibile ottenere questo da qualsiasi rappresentazione AST di un programma C. Basta camminare sull'albero e scaricarlo come un'espressione S. Tutto ciò di cui hai bisogno ora è un buon parser C che costruirà un AST.
Capisco che puoi piegare GNU per farlo. Non so come.
Esistono strumenti in grado di esportare le versioni XML di AST, che sono banalmente equivalenti alle espressioni S. Il nostro software DMS Reengineering Toolkit è uno di questi. Può anche conservare alcune delle direttive del preprocessore. Non una copia di C, ma un dump di Java che fa esattamente la stessa cosa può essere trovato qui .
Quello che troverete un po 'più difficile è rigenerare il testo sorgente valido dall'albero. Se non puoi farlo, fare trasformazioni sull'albero sembra inutile.
Volevi fare questo per applicare le trasformazioni al codice C. Sì, si può fare relativamente con le operazioni ad albero in Lisp relativamente facilmente. Ma hai il codice di quelle trasformazioni in lisp. DMS fornisce la capacità di eseguire trasformazioni, usando la sintassi di superficie del linguaggio (ad esempio, trasfazioni scritte usando la sintassi C per i pattern). Ciò li rende generalmente più facili da scrivere, perché la sintassi della superficie non deve conoscere i dettagli microscopici dell'AST. (DMS ha anche un built-in prettyprinting degli alberi).