2013-03-06 18 views
5

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.

Odpowiedz

1

Wcześniejsza wersja GCC 2.X.X polegała na żubrowaniu podczas analizy. Dlatego pobieranie starej wersji powinno zapewnić Ci to, czego chcesz.

Po prostu zapamiętaj, że nowy atrybut został wprowadzony z nową wersją GCC ...