2013-03-06 7 views
5

Sto rinnovando un analizzatore di linguaggio bison/flex inhouse C, tra cui l'introduzione del corretto supporto __ attribute__.init-declarator-list e grammatica GNU GCC dell'attributo

Poiché non riesco a trovare alcuna grammatica ufficiale in stile BNF che descriva l'idea GNU GCC __ attribute__ (eccetto il documento http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html) Sto estraendo bit e frammenti dallo standard C++ x11 e commenti in varie implementazioni trovate sul web.

Ho quasi finito (almeno quando si tratta di esempi di analisi inclusi nel documento GCC citato sopra) ma un particolare esempio mi ha dato un mal di testa senza alcun accenno di soluzione in fonti esterne.

L'esempio è il seguente:

__attribute__((noreturn)) void d0 (void), 
     __attribute__((format(printf, 1, 2))) d1 (const char *, ...), 
      d2 (void); 

La descrizione allegata dice che:

Un elenco di attributi specificatore può apparire immediatamente prima di un dichiaratore (diverso dal primo) in una virgole elenco separato di dichiaratori in una dichiarazione di più di un identificatore utilizzando un singolo elenco di specificatori e qualificatori . Tali specificatori di attributo si applicano solo all'identificatore prima del cui dichiaratore appaiono.

Così, portandomi a questa soluzione:

init-declarator-list: 
init-declarator 
init-declarator-list , attribute-specifier-seq[opt] init-declarator 

so che funziona, ma vorrei chiedere una verifica/supporto se questo è un modo corretto di risolvere il caso di cui sopra.

Grazie,

Wojciech

EDIT: questo link (un po 'datato, però) dà una soluzione giusta come il mio: http://plg.uwaterloo.ca/~cforall/gcc.y stranamente, non ho inciampato su di essa in precedenza, solo ora quando Ho fatto una ricerca per __ extension__ parola chiave.

risposta

1

Versione precedente di GCC 2.X.X utilizzata per il parsing su bisonte. Quindi scaricare una vecchia versione dovrebbe fornirti ciò che desideri.

Basta stare attenti che nuovi attributi vengano introdotti con la nuova versione GCC ...