Przebudowuję wewnętrzny programator języka bison/oparty na flexie, między innymi wprowadzając poprawną obsługę __ atrybut__.lista deklaracji init i gramatyka GNU GCC
Ponieważ nie mogę znaleźć żadnej oficjalnej gramatyki stylu BNF, która opisuje GNU GCC __ atrybut__ pomysł (z wyjątkiem dokumentu http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html) Wydobywam bity ze standardu C++ x11 i komentarze w różnych implementacjach znalezionych w Internecie.
Prawie udało mi się to zrobić (przynajmniej jeśli chodzi o parsowanie przykładów zawartych w dokumencie GCC, cytowanym powyżej), ale jeden konkretny przykład dał mi ból głowy bez śladu rozwiązania w zewnętrznych źródłach.
Przykładem jest następująca:
__attribute__((noreturn)) void d0 (void),
__attribute__((format(printf, 1, 2))) d1 (const char *, ...),
d2 (void);
Opis dołączony mówi, że:
lista atrybut specifier może natychmiast pojawiają się przed declarator (innego niż pierwszy) w comma- oddzielona lista deklaratorów w deklaracji więcej niż jednego identyfikatora przy użyciu pojedynczej listy specyfikatorów i kwalifikatorów . Takie specyfikatory atrybutów odnoszą się tylko do identyfikatora , przed którego deklaratorem się pojawiają.
Zatem, prowadząc mnie do tego rozwiązania:
init-declarator-list:
init-declarator
init-declarator-list , attribute-specifier-seq[opt] init-declarator
wiem, że to działa, ale chciałbym zasięgnąć do weryfikacji/wsparcia, czy jest to właściwa droga do rozwiązania powyższej sprawie.
Dzięki,
Wojciech
EDIT: ten link (nieco przestarzały, choć) daje rozwiązanie, tak jak moje: http://plg.uwaterloo.ca/~cforall/gcc.y dziwnie, nie natknęliśmy się na to wcześniej, tylko teraz, kiedy Szukałem __ extension__ słowa kluczowego.