5

我正在改进一个内部 C 语言基于 bison/flex 的解析器,其中包括引入适当的 __attribute__ 支持。

由于我找不到任何描述 GNU GCC __ attribute__ 想法的官方 BNF 样式语法(除了http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html文档),我正在从 C 中提取点点滴滴++x11 标准和在网络上找到的各种实现中的注释。

我几乎已经完成了(至少在解析上面引用的 GCC 文档中包含的示例时),但是一个特定的示例让我很头疼,但外部资源中没有任何解决方案的提示。

示例如下:

__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__ 关键字。

4

1 回答 1

1

早期版本的 GCC 2.XX 曾经依赖 bison 进行解析。因此,下载旧版本应该可以满足您的需求。

请注意,新的 GCC 版本会引入新的属性......

于 2013-03-12T13:25:46.433 回答