2012-01-26 11 views
12

Sto cercando di ottenere un AST per C++ che possa quindi analizzare con un programma esterno. Quali programmi sono disponibili per generare un AST per C++? Non mi interessa in che lingua è implementato o il formato di output (purché sia ​​facilmente analizzabile).Ottenere AST per C++?

Il mio obiettivo generale è trasformare un banco di prova di unità C++ nel corrispondente banco di prova del wrapper C#.

+1

"Chiuso come non costruttivo?" Il PO ha una richiesta molto chiara e francamente non ci sono molte risposte, quindi non ci può essere molto dibattito. Le risposte fornite fino ad ora sono supportate da fatti specifici. –

+0

verificate questo: http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/ –

+0

e [qualsiasi strumento di refactoring C/C++ basato su libclang? (anche il più semplice "esempio di giocattolo")] (http://stackoverflow.com/q/7969109/309483) –

risposta

12

È possibile utilizzare clang e in particolare libclang per analizzare il codice C++. È una libreria di alta qualità, scritta a mano per lexing, analisi e compilazione del codice C++, ma può anche generare un AST.

Clang anche supporta C, Objective-C e Objective-C++. Clang stesso è scritto in C++.

+0

Qualche motivo per il blocco del tipo "spoiler"? – Bart

+0

OP non se ne preoccupava. –

+0

Non riesco a capire come ottenere l'AST da clang. Ci sono tutorial su come farlo? –

6

In realtà, GCC emetterà l'AST in qualsiasi fase della pipeline che ti interessa, inclusi i moduli GENERIC e GIMPLE. Controlla le (abbondanti) opzioni della riga di comando che iniziano con -fdump- - ad es. -fdump-tree-original-raw

Questo è uno dei modi più semplici (...) per funzionare, poiché è possibile utilizzarlo su un codice arbitrario; basta passare l'appropriato CFLAGS o CXXFLAGS nella maggior parte Makefiles: “i lavori”

make CXXFLAGS=-fdump-tree-original-raw all 

... e si ottiene

Aggiornato: visto questo sistema di piccola grafica ordinata sulla base di GCC AST di durante il controllo il mio nome bandiera :-) Google FTW.

http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast

2

nostro C++ Front End, costruita in cima alla nostra DMS Software Reengineering Toolkit grado di analizzare una varietà di dialetti C++ (tra cui C++ 11 e ObjectiveC) e di esportazione che AST come un documento XML con una riga di comando. Vedi example ASTs produced by this front end.

In pratica, è necessario più dell'AST; non si può davvero fare molto con C++ (o qualsiasi altro linguaggio moderno) senza una comprensione del significato e della portata di ciascun identificatore. Per C++, significato/ambito sono particolarmente brutti. Il front-end DMS C++ gestisce tutto ciò; può costruire tabelle di simboli completi associando identificatori a tipi espliciti di C++. Questa informazione non è eseguibile in XML con uno switch a riga di comando, ma è "tecnicamente facile" codificare la logica in DMS per camminare sulla tabella dei simboli e sputare XML. (esiste un'opzione per scaricare queste informazioni, ma non in formato XML).

Ti avviso contro l'idea di manipolare (o anche solo analizzare) l'XML. Innanzitutto, XSLT non è un modo particolarmente valido per comprendere il significato degli AST, per non parlare di trasformare l'AST, perché gli AST rappresentano strutture linguistiche sensibili al contesto (è per questo che si vuole [nee MUST HAVE] la tabella dei simboli). Puoi leggere l'XML in un albero simile a una dom se ti piace e scrivere il tuo codice procedurale per manipolarlo. Ma source-to-source transformations sono un modo più semplice; puoi scrivere le tue trasformazioni usando la notazione C++ piuttosto che i bucket del codice goo che si arrampicano su una struttura dati ad albero.

Avrai un altro problema: come generare codice C++ valido dall'XML trasformato. Se non ti dispiace sputare testo non elaborato, puoi risolvere questo problema in modi puramente ad hoc, al prezzo di non avere una garanzia diversa da quella che il codice generato è sintatticamente valido.Se vuoi generare una rappresentazione in C++ del tuo risultato finale come un AST e rigenerare del testo valido da quello, avrai bisogno di uno prettyprinter, che non è tecnicamente difficile ma ancora molto lavoro da costruire specialmente per una lingua grande come C++.

Infine, la ragione per cui esistono strumenti come DMS è fornire la grande quantità di infrastrutture necessarie per elaborare/manipolare strutture complesse come gli AST C++. (analizzare, analizzare, trasformare, prettyprint). Puoi provare a replicare tutti questi macchinari da solo, ma solitamente si tratta di un compromesso tempo/costo/produttività. L'affermazione è che è meglio rimanere all'interno dell'ecosistema degli strumenti piuttosto che sfuggirne e crearne di proprie. Se non lo hai fatto prima, lo troverai dolorosamente.

FWIW, DMS è stato utilizzato per eseguire enormi analisi e trasformazioni su codice sorgente C++. Vedi Publications on DMS e controlla i documenti di Akers su "Re-engineering dei modelli di componenti C++".

Clang si basa sullo stesso tipo di filosofia; c'è un ecosistema di strumenti.

YMMV, ma sarei sorpreso.