当查看C的BNF语法时,我认为声明的生产规则看起来像这样很奇怪(根据https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C%20in%20Backus-Naur%20form.htm):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
为什么要*
为此使用量词(表示零次或多次出现)init-declarator
?这允许诸如int;
或之类的语句void;
在语法上有效,即使它们在语义上无效。他们难道不是在生产规则中使用了+
量词(一次或多次)*
吗?
我尝试编译一个简单的程序,以查看编译器的输出,它所做的只是发出警告。
输入:
int main(void) {
int;
}
输出:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
2
区别在于BNF仅定义语法。语法上允许很多事情,但仍然无效(或荒谬)C.不错的发现!
—
larkey
啊,请
—
larkey
int
用作函数的返回类型,main
而不要()
用作函数中的参数类型列表(void)
。
从概念上讲,这没有什么真正的错误,只是听起来有点可笑:它基本上是在询问计算机“我想要零个int变量,请给我一个名字:[emptyset]”。毕竟,您可以向某人要零个苹果(尽管它可能会引起比要一个苹果更有趣的反应,但这并不是天生的荒谬说法)。因此,为什么它在C语言中不合语法?这种语法没有错。
—
The_Sympathizer
无论如何,当我们包含空泡(或真空?)的情况时,通常情况会好得多。
—
The_Sympathizer
有时编写程序的不是人,而是另一个程序。这样的程序有时可能希望打印“ int”,然后打印我们需要的evarname的逗号分隔列表,然后打印“;”。并且很高兴不需要先检查所述列表是否为空。
—
哈根·冯·埃岑