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.