Il codice VC ++ DOM è accessibile da componenti aggiuntivi VS?


100

Visual Studio IntelliSense per VC ++ include il parser C ++ EDG "completo" (utilizzato anche da Intel e altri). Poiché il DOM in codice C # è accessibile ai componenti aggiuntivi (correggimi se sbaglio), è accessibile anche il DOM in codice C ++? Può essere utilizzato per analizzare un progetto VC ++ aperto all'interno dell'ambiente VS?


25
È appena arrivato dal tuo altro thread ; questa è una buona domanda.
Qix - MONICA ERA MALTRATTATA il

81
Di nuovo, "non è chiaro cosa stai chiedendo?" - davvero gente? "Non so nulla della premessa di questa domanda" non significa "Non è chiaro quello che stai chiedendo".
Tim Post

9
@ Dave - Ho aggiunto una risposta per dimostrare che anche i non dipendenti MS possono risolvere questo problema. Ci sono persone che hanno fatto cose vicine a quello che volevo.
TheFlash

55
@DaveHillier Se è in tema, qui è perfettamente benvenuto. Non c'è discussione oltre a questo. Se iniziamo a parlare di "Qualcuno qui può anche rispondere a questo?" quindi ci avviciniamo rapidamente a questo tipo di angoscia appiccicosa in cui qualsiasi cosa difficile è potenzialmente senza risposta. A meno che non apriamo effettivamente la domanda per le risposte , francamente non abbiamo un'idea concreta su chi potrebbe rispondere. Questo è il punto centrale di chiedere in primo luogo.
Tim Post

49
@bmargulies Che male fa questa domanda semplicemente esistendo? È in tema, è interessante e qualcuno potrebbe plausibilmente rispondere. Diamine, qualcuno di SM potrebbe vederlo e rispondere, e quindi è una grande aggiunta al sito. Per favore smetti di cercare qualsiasi cosa potenzialmente negativa su una domanda prima di provare a vedere qualcosa di positivo.
Tim Post

Risposte:


22

L' estensione Refactoring di Visual C ++ è in grado di rinominare un membro a livello di progetto. È costruito da MS ma ovviamente hanno usato il codice DOM interno per ottenere questo risultato. Quindi è possibile, ma non so ancora come.

L' estensione CppLister è in grado di leggere i database intellisense creati da VS per elencare i vari membri all'interno di una classe.

È sempre possibile utilizzare il parser C ++ Clang open source (in realtà compilatore) e leggere l'AST in un modello a oggetti C #. Vedere CppSharp e ClangSharp per le associazioni C # a Clang.


8

Non sono sicuro di cosa sia il "DOM in codice C ++", se esiste. Ciò che conta è che MSVS utilizzi il front-end EDG per analizzare e determinare il significato dei simboli, per supportare le azioni IDE di MSVS. EDG IIRC costruisce le proprie strutture dati interne che rappresentano il programma; Non ho motivo di credere che quelle strutture dati siano il "DOM in codice C ++", o che siano visibili a te o che potresti scoprirle su MSDN.

Il tuo vero problema dichiarato è che vuoi analizzare il codice sorgente C ++. Sono d'accordo, avere le informazioni front-end EDG sarebbe un aiuto significativo per farlo; si davvero davvero non si vuole tentare di scrivere il proprio parser C ++ (ed hai bisogno di un sacco di roba ultimi analisi, google il mio saggio su "vita dopo l'analisi").

Quindi hai le seguenti scelte:

  • Trova una porta nel macchinario EDG in MSVS. Dal momento che non hai avuto molta fortuna e sembra che non ci sia nulla di documentato da MS che dica che questo è disponibile, probabilmente non avrai molta fortuna in questo modo. Se fossi nei panni della SM, non lo renderei pubblico; sarebbe solo un altro problema di supporto, e su un pezzo di software che non è nemmeno il loro.
  • Usa il front-end EDG commerciale, direttamente da EDG . La mia comprensione è che offrono gratuitamente licenze per uso individuale. (La mia comprensione potrebbe essere sbagliata). In questo modo salti qualsiasi restrizione che MS potrebbe avere sull'accesso ... al prezzo di dover configurare tu stesso il front-end EDG. Uno svantaggio: EDG vuole essere il front-end di un compilatore, non il front-end di un analizzatore. Questa distinzione può sembrare sottile ma probabilmente ti morderà. Ad esempio, sospetto che EDG butti via i commenti; i front-end del compilatore non ne hanno bisogno. Se vuoi controllare i commenti nel tuo analizzatore, questo potrebbe essere un vero problema.
  • Usa Clang . Si tratta di un parser C ++ open source, progettato per essere utilizzato per un'ampia varietà di scopi di analisi del programma e per il front-end di un compilatore C ++. Non ho esperienza con questo, ma sembra abbastanza ben congegnato e sembra offrire molti servizi. Non so se ha un supporto specifico per il dialetto MS di C ++.
  • Utilizza un altro front-end commerciale, il nostro front-end (DMS) C ++. Essendo l'architetto di questo, sono abbastanza sicuro che sia ben pensato (incluso il supporto per MS Visual C ++); esiste un'esperienza specifica nell'utilizzo di questo per eseguire complesse attività di analisi e trasformazione C ++. A differenza di EDG, è progettato per supportare l'analisi, la trasformazione e la generazione (ad esempio, cattura i commenti e persino la radice dei letterali in modo che possano essere rigenerati correttamente). La base, DMS, ha molti macchinari integrati per supportare l'analisi personalizzata: costruzione di tabelle AST e simboli, grammatiche degli attributi, framework del flusso di dati, controllo intraprocedurale e analisi del flusso di dati a livello di AST, gestione BDD, corrispondenze di pattern sorgente, source-to trasformazioni di origine. Clang e EDG offrono AST e la costruzione di tabelle dei simboli; Clang (ma non credo che EDG) abbia un'analisi del flusso (a livello LLVM), ma non analisi di flusso a livello AST (AFAIK). Né Clang né EDG offrono il modello sorgente / capacità di trasformazione, quindi quale è meglio dipende dalle tue attività a lungo termine. Rispetto alle altre opzioni, il nostro front-end C ++ non è open source o gratuito; si possono ottenere licenze di ricerca.

2
"DOM" è il linguaggio HTML per un AST, fondamentalmente. Presume che esista una sintassi canonica, tuttavia, mentre i compilatori C ++ di solito usano sintassi leggermente diverse. (Ad esempio per creare messaggi di errore migliori.).
MSalters

3
DOM in C # significa "AST con cattiva risoluzione" utilizzato per la generazione del codice. Non è possibile analizzare realisticamente i programmi C ++ con il tipo di risoluzione offerto da C # dom.
Ira Baxter

Vedi inevitablesoftware.com/Products.aspx per quello che offre un buon codedom C #
TheFlash

@ Geotarget: e cosa c'entra un C # Dom con la domanda?
Ira Baxter

@IraBaxter - Quello che cerco quando dico "Code DOM" - molte persone hanno commentato di non capire cosa sia un Code DOM e / o di confonderlo con JS HTML DOM. Ovviamente non sono un esperto di C ++ (come ho affermato prima) quindi non so cosa potrebbe essere necessario in un DOM di codice C ++, anche se capisco che Inevitablesoftware fornisce un DOM di codice molto semplice e facile da usare, e io sono alla ricerca di un DOM in codice C ++ con un'API simile.
TheFlash
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.