在查看 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)