2012-01-11 10 views
6

Ho bisogno di passare attraverso un file C/C++ ed estrarre l'elenco di classi e metodi e dove si trovano sul file.Come analizzare/analizzare semplice codice C/C++ da C# per ottenere un elenco di metodi

libclang è l'opzione migliore? O è "troppo" per l'attività?

Sarebbe meglio cercare solo le parentesi?

Nel caso in cui libclang sia la scelta: esiste un modo per richiamarlo da C#?

Grazie!

+0

Ovviamente c'è sempre un modo per richiamare il codice C++ da .NET, utilizzando C++/CLI. Una soluzione più portabile sarebbe quella di fornire un semplice wrapper C attorno a libclang (dovrebbe essere abbastanza semplice). Ma la soluzione migliore sarebbe quella di optare per una versione precedente di Clang, quando la sua bella stampante XML esisteva ancora. È davvero triste che sia stato rimosso da Clang. –

+0

Un'altra opzione (un po 'arrugginita, ma funziona ancora per la maggior parte dei casi) è il parser Elsa combinato con il preprocessore gcc. –

+0

Non è chiara la precisione di una risposta. Potresti costruire una soluzione basata su parentesi di accoppiamento che probabilmente produrrebbe informazioni semplici su metodo/classe il 90% delle volte, con errori spettacolari l'altro 10%. Cosa intendi fare con i risultati? –

risposta

6

Si potrebbe considerare ctags, disponibile su molte piattaforme. L'output è facilmente analizzabile e pieno di informazioni necessarie.

maggiori informazioni Per la vostra domanda, ho dovuto guardare alle molte opzioni disponibili, e dopo un po 'ho trovato. Per esempio:

ctags -N -x --c-kinds=+p crowd.* 

produce questa uscita

CrowdSim   class  44 crowd.h   class CrowdSim 
CrowdSim   function  47 crowd.h   CrowdSim(const std::string& contentDir) : _contentDir(contentDir) {} 
Particle   function  35 crowd.h   Particle() 
Particle   struct  25 crowd.h   struct Particle 
_contentDir  member  56 crowd.h   std::string _contentDir; 
_crowd_H_  macro  18 crowd.h   #define _crowd_H_ 
_particles  member  57 crowd.h   std::vector<Particle> _particles; 
animTime   member  32 crowd.h   float animTime; 
chooseDestination function  24 crowd.cpp  void CrowdSim::chooseDestination(Particle &p) 
chooseDestination prototype 53 crowd.h   void chooseDestination(Particle &p); 
dx    member  28 crowd.h   float dx, dz; // Destination position 
dz    member  28 crowd.h   float dx, dz; // Destination position 
fx    member  29 crowd.h   float fx, fz; // Force on particle 
fz    member  29 crowd.h   float fx, fz; // Force on particle 
init    function  35 crowd.cpp  void CrowdSim::init() 
init    prototype 49 crowd.h   void init(); 
node    member  31 crowd.h   H3DNode node; 
ox    member  30 crowd.h   float ox, oz; // Orientation vector 
oz    member  30 crowd.h   float ox, oz; // Orientation vector 
px    member  27 crowd.h   float px, pz; // Current postition 
pz    member  27 crowd.h   float px, pz; // Current postition 
update   function  68 crowd.cpp  void CrowdSim::update(float fps) 
update   prototype 50 crowd.h   void update(float fps); 

(nota: -x è solo per l'ispezione utente facile)

+0

Sembra che questa sia probabilmente l'opzione migliore. È in grado di dirti dove è un metodo e il suo corpo? O solo dove è la dichiarazione del metodo? – pablo

+0

per esempio, per la funzione CrowdSim :: update, è possibile sapere dove si trova il suo corpo? – pablo

+0

sì, il corpo è in crowd.cpp line 68 – CapelliC

0

È meglio utilizzare un parser completo IMO. È possibile utilizzare ANTLR. Ha sia la grammatica C/C++ che il generatore di parser C#.

+1

La grammatica ANTLR per C/C++ non è buona come libclang AFAIK. libclang fa il lavoro per te, devi decorare l'intera grammatica C/C++ se vuoi usare il metodo ANTLR – pablo

+1

Un "parser completo" non è quasi sufficiente, quando c'è un preprocessore e un percorso di inclusione specifico della piattaforma complicato configurazione presente. –

+1

... e non penso che la grammatica ANTLR sia effettivamente completa. Le note di rilascio contengono informazioni sull'autore che dicono che non l'ha davvero finito. –

1

Non sicuro qual è l'opzione migliore, ma è possibile dare un'occhiata a GCC-XML o Mono/CXXI pure. Quest'ultimo usa GCC-XML internamente, ma fornisce anche interfacce C# alle definizioni delle classi C++.

libclang è una libreria C e quindi dovrebbe essere utilizzabile da .NET tramite P/Invoke, ma potrebbe essere piuttosto noioso ripetere tutte le dichiarazioni necessarie in C#.

1

Un altro angolo sarebbe creare un'estensione per Visual Studio.

+0

È certamente un'opzione, specialmente con le novità sull'ultima versione, ma mi piacerebbe avere una soluzione indipendente da VS. – pablo

+0

ah, ok. bene, lo lascerò entrare, nel caso qualcuno lo trovi utile per i loro bisogni. – justin

4

Per farlo bene, si ha realmente bisogno di qualcosa che contiene un completo C++ parser.

Per questo è possibile utilizzare il nostro DMS Software Reengineering Toolkit con il suo C++ Front End. Può fornire sia le precise dichiarazioni di entità che i tipi e il loro contesto (classe/spazio dei nomi/...) e le posizioni dei file precise. DMS fornisce accesso a tutte queste informazioni come un insieme di AST e relative tabelle dei simboli; costruisci un codice personalizzato per navigare/prendere ciò che vuoi.

A seconda delle esigenze, è possibile che le informazioni desiderate siano difficili da elaborare utilizzando vanilla C#. Le informazioni sul tipo nella sua piena gloria sono piuttosto complesse, perché il C++ è un linguaggio complesso. Se vuoi elaborare queste informazioni, ti consigliamo di "stare dentro" DMS dove sono presenti tutti i meccanismi per farlo. Se tutto ciò che si desidera è il nome e le informazioni sul tipo come stringhe di testo, è possibile ottenere DMS per eseguire una copia di questi dati in tale formato; ha librerie standard che supportano tali attività. Una risposta intermedia sarebbe quella di esportare i dati in formato XML; DMS fornisce supporto diretto per l'esportazione di frammenti AST arbitrari ma solo supporto indiretto per la scrittura di informazioni sui tipi come XML, ma non sarebbe difficile personalizzarle.

MODIFICA: (in risposta al commento OP in un'altra risposta) DMS può fornire informazioni precise sia sulla firma del metodo, sia sul corpo del metodo. Ha informazioni complete su AST e sul tipo per entrambi.

+0

Sembra fantastico! Ora ho bisogno di informazioni sui prezzi ... come posso contattarti? – pablo

+0

Vedere la mia biografia per un indirizzo email. Naturalmente, c'è sempre il sito stesso: -} –

+0

Il tuo primo link è rotto: O (su questa risposta) – pablo

1

Se si desidera utilizzare Clang, si consiglia di dare un'occhiata a this page. Dimostra come ottenere tutti i metodi virtuali da un file. Una volta compreso questo semplice esempio, è possibile creare abbinamenti più complessi.

Problemi correlati