私は社内の C 言語 bison/flex ベースのパーサーを刷新しています。とりわけ、適切な __attribute__ サポートを導入しています。
GNU GCC __ attribute__ のアイデアを説明する公式の BNF スタイルの文法が見つからないため ( http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.htmlドキュメントを除く)、C からビットとピースを抽出しています。 ++x11 標準と、Web で見つかったさまざまな実装のコメント。
私はほぼ完了しました (少なくとも、上記の GCC のドキュメントに含まれる例の解析に関しては) が、外部ソースに解決策のヒントがない 1 つの特定の例が頭痛の種になりました。
例は次のとおりです。
__attribute__((noreturn)) void d0 (void),
__attribute__((format(printf, 1, 2))) d1 (const char *, ...),
d2 (void);
添付の説明には次のように書かれています。
属性指定子リストは、指定子と修飾子の単一のリストを使用する複数の識別子の宣言で、宣言子のコンマ区切りリスト内の宣言子 (最初のもの以外) の直前に表示される場合があります。そのような属性指定子は、それらが現れる宣言子の前の識別子にのみ適用されます。
したがって、私をこの解決策に導きます:
init-declarator-list:
init-declarator
init-declarator-list , attribute-specifier-seq[opt] init-declarator
機能することはわかっていますが、これが上記のケースを解決する適切な方法である場合は、検証/サポートを求めたいと思います.
ありがとう、
ヴォイチェフ
編集: このリンク (少し古いですが) は私のものと同じように解決策を提供します: http://plg.uwaterloo.ca/~cforall/gcc.y 奇妙なことに、以前に遭遇したことはありません。 __ extension__ キーワードの検索。