CのBNF文法を調べたとき、宣言のプロダクションルールが次のようになっているのは奇妙だと思いました(https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%によると) 20C%20in%20Backus-Naur%20form.htm):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
なぜ*量指定子(0回以上のオカレンス)を使用するのinit-declaratorですか?これにより、int;またはなどのステートメントvoid;は、意味的に無効であっても、構文的に有効になります。プロダクションルールでは+なく、数量詞(1つ以上のオカレンス)を使用しただけではありません*か?
単純なプログラムをコンパイルして、コンパイラーが何を出力するかを確認しましたが、コンパイラーが行うのは警告を出すことだけです。
入力:
int main(void) {
int;
}
出力:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
int戻り値の型としてmain使用()し、関数のパラメーター型リストとしては使用しないでください(void)。