小编raf*_*lfp的帖子

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

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

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}* ;
Run Code Online (Sandbox Code Playgroud)

为什么对 ? 使用*量词(表示出现零次或多次)init-declarator?这允许诸如int;或 之类的语句void;在语法上有效,即使它们在语义上无效。难道他们不能只在产生式规则中使用+量词(出现一次或多次)*吗?

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

输入:

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}* ;
Run Code Online (Sandbox Code Playgroud)

输出:

int main(void) {
    int;
}
Run Code Online (Sandbox Code Playgroud)

c context-free-grammar language-lawyer

29
推荐指数
2
解决办法
1108
查看次数

标签 统计

c ×1

context-free-grammar ×1

language-lawyer ×1