C 的语法如何允许这种未命名的嵌套结构?

问题描述 投票:0回答:1

C 的 K&R 和 Microsoft 语法表明了这个简单的结构:

struct { int a ; } ;

在解析时匹配

declaration

declaration
 declarationSpecifier ';'
  typeSpecifier ';'
   structOrUnionSpecifier ';'
    structOrUnion '{' structDeclarationList '}' ';'
     'struct' '{' structDeclaration '}' ';'
      'struct' '{' specifierQualifierList structDeclaratorList ';' '}' ';'
       'struct' '{' typeSpecifier structDeclarator ';' '}' ';'
        'struct' '{' 'int' declarator ';' '}' ';'
         'struct' '{' 'int' directDeclarator ';' '}' ';'
          'struct' '{' 'int' identifier ';' '}' ';'
           'struct' '{' 'int' 'a' ';' '}' ';'

因此是合法的。但是如果我们将它嵌套在另一个结构中,例如

struct { struct { int a ; } ; } ;

解析变成:

declaration
 declarationSpecifier ';'
  typeSpecifier ';'
   structOrUnionSpecifier ';'
    structOrUnion '{' structDeclarationList '}' ';'
     'struct' '{' structDeclaration '}' ';'
      'struct' '{' specifierQualifierList structDeclaratorList ';' '}' ';'
       'struct' '{' typeSpecifier structDeclarator ';' '}' ';'
        'struct' '{' structOrUnionSpecifier declarator ';' '}' ';'
         'struct' '{' structOrUnion '{' structDeclarationList '}' directDeclarator ';' '}' ';'
          'struct' '{' 'struct' '{' structDeclaration '}' identifier ';' '}' ';'

此时正在强制使用

identifier
,而我们不想要像
struct{struct{int a;}b;};
中那样的位置,但如果我们忽略该规则并省略
b
,那么
struct{struct{int a;};};
仍然可以毫无问题地编译。

当语法表明需要额外的

struct{struct{int a;};};
时,
identifier
如何以及为什么可以编译?我是否误解了语法,或者实际的语法不是我想象的那样?

c parsing struct grammar
1个回答
0
投票

参考 K&R 第 193 页(ANSI 版本)

declaration-specifiers:
    storage-class-specifier declaration-specifiersopt
    type-specifier declaration-specifiersopt
    type-qualifier declaration-specifiersopt

type specifier: one of
    void char short int long float double signed
    unsigned struct-or-union-specifier enum-specifier typedef-name

类型说明符的元素之一是struct-or-union。声明说明符是递归的且可选的,因此您可以嵌套未命名的结构。

© www.soinside.com 2019 - 2024. All rights reserved.