2013-03-06 33 views
5

Bir inhouse C dil bison/flex-based ayrıştırıcısını yenileyerek diğerleri arasında uygun __ attribute__ desteği tanıyorum.init-declarator-list ve GNU GCC özniteliği grameri

Ben GNU GCC açıklar herhangi bir resmi BNF tarzı dilbilgisi bulamıyorum beri __ İnternetten bulduğum çeşitli uygulamalarda ufak tefek C++ x11 standardından ve yorum ayıklanması am (http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html belgenin hariç) attribute__ fikir.

Neredeyse bunu başardım (en azından yukarıda belirtilen GCC'nin belgesinde yer alan örnekleri ayrıştırmak söz konusu olduğunda), ancak belirli bir örnek bana dış kaynaklarda hiçbir çözüm ipucu vermeyen bir baş ağrısı verdi.

örnek aşağıdaki gibidir:

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

ekli açıklama söylüyor:

Bir özellik belirtici listesi virgülle- (ilk dışında) Bildiricisi hemen önce görünebilir bildiricilerinden oluşan bir liste içinde, belirticilerin ve niteleyicilerin tek bir listesini kullanarak birden fazla tanımlayıcının beyanı. Bu öznitelik belirticileri, yalnızca belirleyicilerinin göründükleri tanımlayıcısına uygulanır.

Böylece, bu çözüme beni lider:

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

bunun işe yaradığını biliyorum ama bu yukarıda belirtilen meseleye çözüm etmenin uygun bir yolu olup olmadığını doğrulama/destek aramak istiyorum.

sayesinde

Wojciech

DÜZENLEME: Bu bağlantı (gerçi, biraz tarihli) tıpkı bir çözüm sunar mayın: http://plg.uwaterloo.ca/~cforall/gcc.y garip, ben ancak şimdi zaman, daha önce bunun üzerine tökezledi değil __ extension__ anahtar kelimesi için arama yaptım.

cevap

1

GCC 2.X.X'in önceki sürümü, ayrıştırma için bizonu kullanacağız. Yani eski bir sürümü indirmek istediğiniz şeyi size sunmalıdır.

Yeni GCC sürümüyle yeni özniteliğin eklendiğinden emin olun ...