为什么C的BNF语法允许使用init-declarators的空序列进行声明?

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

[浏览C的BNF语法时,我认为声明的生产规则看起来像这样(根据https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm,这很奇怪:]

<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;

为什么将*用作初始声明符?这允许诸如“ int;”之类的语句。或“无效”;即使在语义上无效,在语法上也有效。他们不能在生产规则中使用+代替*吗?

我尝试编译一个简单的程序以查看编译器的输出,并且它所做的只是发出警告。

输入:

void main() {
    int;
}

输出:

test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
     int;
     ^~~
c context-free-grammar
2个回答
1
投票

[declaration-specifier包括type-specifier,其中包括enum-specifier。像]这样的构造

enum stuff {x, y};

是有效的declaration,没有init-declarator

int;之类的结构被constraints beyond the grammar排除:

除static_assert声明外的声明应至少声明一个声明符(函数的参数或结构或联合的成员除外),标记或枚举的成员。


1
投票

语言不允许这种结构,请参见以下约束,例如C17 / 18§6.7:

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