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)
。