Dove posso trovare la grammatica standard BNF o YACC per il linguaggio C ++?

StackOverflow https://stackoverflow.com/questions/613479

  •  03-07-2019
  •  | 
  •  

Domanda

Sto cercando di lavorare su una specie di generatore di codice per aiutare l'unità a testare un progetto misto C / C ++ legacy. Non trovo alcun tipo di strumento indipendente in grado di generare il codice stub dalla dichiarazione. Quindi decido di costruirne uno, non dovrebbe essere così difficile.

Per favore, chiunque può indicarmi un collegamento grammaticale standard, meglio descritto dal linguaggio yacc.

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

I migliori saluti, Kevin

È stato utile?

Soluzione

Dalle Domande frequenti sul C ++ Lite :

38.11 Esiste una grammatica C ++ compatibile con Yacc?

  

La grammatica yacc primaria che vorrai   è di Ed Willink. Ed crede al suo   la grammatica è pienamente conforme a the   Standard ISO / ANSI C ++ , comunque lui   non lo garantisce: "ha la grammatica   Non, " dice, "stato usato nella rabbia".   Puoi ottenere la grammatica senza   routine di azione o la grammatica   con routine di azioni fittizie . tu   può anche ottenere il corrispondente   lexer . Per quelli che lo sono   interessato a come raggiunge a   parser senza contesto (premendo tutto   le ambiguità più un piccolo numero di   riparazioni da effettuare in seguito dopo l'analisi   è completo), potresti voler leggere   capitolo 4 di la sua tesi .

     

Esiste anche una grammatica yacc molto antica   che non supporta modelli,   eccezioni, né spazi dei nomi; inoltre   si discosta dal linguaggio principale in   alcuni modi sottili. Puoi prenderlo   grammatica qui o qui .

Altri suggerimenti

Di recente ho trovato alcuni file grammaticali per C ++ (C ++ 1998: ISO / IEC 14882: 1998 e C ++ 2008: ISO / IEC SC22 / WG21 N2723 = 08-0233 ) sul sito web di grammatica . Le grammatiche sono rappresentate nella notazione Enahnced BNF, DMS BNF, BGF, SDF e Rascal . È un peccato, tuttavia, che le grammatiche C ++ non vengano aggiornate (no C ++ 2003 o C ++ 11).

Il link di Jared è la cosa più vicina a una grammatica senza contesto che puoi ottenere. Alcune cose devono essere ritardate per dopo, ma questo è per alcuni argomenti migliore della grammatica sensibile al contesto di C ++.

A peggiorare le cose, C ++ 1x complicherà notevolmente la grammatica. Per arrivare a un'analisi perfetta del C ++, un parser dovrà implementare abbastanza dello standard per eseguire correttamente la risoluzione del sovraccarico, inclusa la deduzione dell'argomento template, che a sua volta richiederà il meccanismo dei concetti, lambdas e in effetti quasi tutto il lingua, ad eccezione della ricerca del nome in due fasi e delle specifiche delle eccezioni che, se ricordo bene, non necessitano di una reale implementazione per analizzare un programma con successo.

In effetti, sei a metà strada per un compilatore se riesci ad analizzare C ++.

Per un altro approccio, è possibile prendere in considerazione il supporto delle spalle su un compilatore esistente.

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

Sfortunatamente, GCC-XML è gestito solo per 1/4, e farlo funzionare può essere ... interessante. Buona fortuna, se segui questa strada.

Ho trovato questo recentemente. 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 quadro .

Dopo aver riletto il tuo commento ...

Penso che questo strumento soddisfa esattamente le tue esigenze.

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

Uno " semplice " la trasformazione sta strumentando il codice per raccogliere la copertura del test dati; lo offriamo come strumento COTS. Vedi questo documento per capire come lo fa DMS: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

EDIT settembre 2013 (Questa risposta stava diventando un po 'stantia): il C ++ di DMS l'analisi del flusso di controllo / risoluzione dei nomi / controllo gestisce il C ++ 11 completo nelle varianti ISO, GNU e Microsoft. Inoltre analizzerà (e manterrà) codice sorgente contenente la maggior parte dei condizionali del preprocessore. Ha una grammatica esplicita guidare il processo di analisi, a differenza di GCC o Clang.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top