2009-03-05 26 views
18

Sto provando a lavorare su una specie di generatore di codice per aiutare a testare unitamente un progetto misto C/C++ legacy. Non trovo alcun tipo di strumento indipendente in grado di generare codice stub dalla dichiarazione. Quindi decido di costruirne uno, non dovrebbe essere così difficile.Dove posso trovare la grammatica standard BNF o YACC per il linguaggio C++?

Per favore, chiunque può indicarmi un link di grammatica standard, meglio descritto dal linguaggio yacc.

Spero di non reinventare la ruota, per favore aiutami in questo caso.

migliori saluti, Kevin

+0

Per generare il codice stub da una dichiarazione, è necessario prima analizzare la dichiarazione. Questo in pratica significa un parser C++ completo. Davvero non vuoi farlo. –

risposta

2

Per un altro approccio, è possibile prendere in considerazione il backup su un compilatore esistente.

GCC-XML "compila" C++ in file XML con molte informazioni utili; potrebbe essere sufficiente per i tuoi scopi.

Sfortunatamente, GCC-XML è mantenuto solo per 1/4 e il suo utilizzo può essere ... interessante. Buona fortuna, se segui questa strada.

20

Dal C++ FAQ Lite:

38.11 Is there a yacc-able C++ grammar?

La grammatica yacc primario si vorrà è da Ed Willink. Ed crede che la sua grammatica sia pienamente compatibile con the ISO/ANSI C++ standard, tuttavia egli non lo autorizza: "la grammatica ha non", dice, "usato nella rabbia". È possibile ottenere the grammar without action routines o the grammar with dummy action routines. È inoltre possibile ottenere the corresponding lexer. Per coloro che sono interessati a come si realizza un parser context-free (spingendo tutti le ambiguità più un piccolo numero di riparazioni da fare più tardi, dopo l'analisi di è completa), si potrebbe desiderare di leggere capitolo 4 della his thesis.

C'è anche una grammatica yacc molto vecchia che non supporta modelli, eccezioni, né spazi dei nomi; inoltre, devia dalla lingua principale in in alcuni modi. Puoi ottenere la grammatica here o here.

+2

Se è necessario analizzare veramente il C++, è necessario un macchinario che funzioni davvero. "Non usato in rabbia" significa che non funziona con codice C++ reale. (Non capisco perché questa risposta sia stata favorita/svalutata così tante volte visto quanto completamente inefficace sarà questa risposta). –

+1

@Ira: La mia ipotesi sul motivo per cui è upvoted è che non c'è davvero niente di meglio. L'analisi di C++ è difficile. –

+1

Ira ha ragione. Probabilmente finirai per perdere tempo. Sono tutto per costruire il tuo, e tuffarmi nella tana del coniglio, se quello che vuoi fare è imparare. Ma se si vuole ottenere un lavoro, è consigliabile ottenere qualcosa che funzioni fuori dalla scatola. Gli strumenti DMS hanno altri vantaggi in quanto copre un sacco di lingue e ha funzionalità aggiuntive che potresti trovare utili nel tuo progetto. Se il tuo tempo vale la pena (quindi non lo fai per divertimento) allora i prezzi sono ragionevoli. –

1

Ho trovato di recente this one. Non l'ho provato, quindi non sono sicuro che funzioni. Potresti fornire maggiori informazioni sullo strumento che stai cercando di sviluppare? Ho scaricato questa grammatica perché sto lavorando a uno strumento di strumentazione in modo da poter aggiungere informazioni sulla copertura per il mio unit test framework.

dopo aver riletto il tuo commento ...

Penso this tool adattarsi esattamente alle vostre esigenze.

+0

In realtà sto lavorando a qualcosa che effettivamente appartiene a un quadro di test unitario. Per testare una singola unità di traduzione, è necessario fornire riferimenti esterni per produrre un binario eseguibile, quindi sto cercando di analizzare il codice sorgente per trovare le dichiarazioni e generare la definizione di stub. –

2

Il collegamento di Jared è la cosa più vicina a una grammatica senza contesto che puoi ottenere. Alcune cose devono essere posticipate per un secondo momento, ma questo è meglio di alcuni argomenti rispetto alla grammatica sensibile al contesto del C++.

Per peggiorare le cose, il C++ 1x complicherà significativamente la grammatica. Per ottenere un'analisi perfetta del C++, un parser dovrà implementare un numero sufficiente di standard per eseguire correttamente la risoluzione del sovraccarico, inclusa la deduzione degli argomenti del modello, che a sua volta richiederà il meccanismo dei concetti, lambda e in effetti quasi tutti i lingua, fatta eccezione per la ricerca del nome in due fasi e le specifiche delle eccezioni che, se ricordo correttamente, non hanno bisogno di un'attuazione effettiva per analizzare correttamente un programma.

In effetti, sei a metà strada da un compilatore se puoi analizzare C++.

+0

Se non è possibile eseguire completamente la risoluzione dei nomi, non ci si avvicina nemmeno a un compilatore C++. L'analisi è molto più semplice della risoluzione dei nomi. –

+1

No, perché l'analisi richiede la risoluzione del nome; questo è il mio punto. La grammatica di C++ è così brutta. – coppro

+0

L'analisi in C++ NON richiede la risoluzione dei nomi se si utilizza un parser GLR.In effetti, è molto semplice e lo facciamo ogni giorno con il nostro strumento DMS (www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html). Se insisti a usare un parser LALR (1) che non tollera l'ambiguità locale, * allora * devi risolvere il tuo nome mentre analizzi e sono d'accordo che è un disastro, ma poi c'è la tua ragione per non farlo in quel modo. Fare la risoluzione dei nomi per C++ anche con ambiguità locali è ancora piuttosto difficile, lo garantirò, ma non così male come quando sono aggrovigliato con il parser. –

1

Il nostro DMS Software Reengineering Toolkit può essere ottenuto con un robusto parser C++ con funzionalità complete, . Vedi http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Questo costruisce AST e tabelle di simboli e può inferire il tipo di qualsiasi espressione. DMS consente di eseguire analisi e trasformazioni arbitrarie sul codice C++.

Una trasformazione "semplice" sta strumentando il codice per raccogliere i dati di copertura di prova ; offriamo questo come strumento COTS. Vedere questo articolo per capire come DMS fa: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

EDIT settembre 2013 (Questa risposta è stata sempre un po 'stantio): C++ parser/risoluzione dei nomi/controllo di analisi del flusso dei DMS gestisce completa C++ 11, nel Varianti ISO-, GNU- e Microsoft. Inoltre analizzerà (e conserverà) il codice sorgente contenente la maggior parte delle condizioni del preprocessore. Ha una grammatica esplicita che guida il processo di analisi, diversamente da GCC o Clang.

+0

Mentre stackoverflow non favorisce o disapprova direttamente le soluzioni open source e/o gratuite, generalmente è una cattiva idea mettere un collegamento contorto che non punta direttamente a una soluzione. Se vuoi veramente promuovere il tuo strumento, punta almeno a una pagina che abbia qualche codice di esempio e dipendenze che puoi usare senza dover leggere i blurb aziendali ei link di download murati. –

+0

OP ha detto che voleva una grammatica, ma che il suo vero problema è analizzare il C++ per estrarre informazioni per generare stub. La mia risposta mostra come risolvere il suo vero problema ignorando la sua idea poco pratica di ottenere una grammatica di lavoro (praticamente non esistono per i generatori di parser convenzionali) e quindi di analizzare in qualche modo senza risolvere il problema della risoluzione dei nomi (che è una quantità enorme di lavoro). Questo "anello contorto" punta direttamente a una risposta pratica. –

+0

Non c'è bisogno di esprimere un parere se si pensa che una domanda non sia pratica. Lascia che qualcun altro più qualificato per la domanda risponda o lascia che la domanda rimanga senza risposta e sia dimostrata giusta. In secondo luogo, ho visitato quella pagina e non sono riuscito a trovare alcuna risposta, tranne un po 'di marketing su un front-end che non aveva alcun esempio né link per il download. Se c'è una risposta reale, modifica la risposta e aggiungila qui nel caso in cui il sito non funzioni. –

4

Recentemente ho trovato alcuni file di grammatica per C++ (C++ 1998: ISO/IEC 14882: 1998 e C++ 2008: ISO/IEC SC22/WG21 N2723 = 08-0233) al grammarware website. Le grammatiche sono rappresentate nella notazione Enahnced BNF, DMS BNF, BGF, SDF e Rascal. È un peccato, però, che le grammatiche del C++ non sembrino essere aggiornate (niente C++ 2003 o C++ 11).

Problemi correlati