Ao examinar a gramática BNF de C, achei estranho que a regra de produção de uma declaração tivesse essa aparência (de acordo com https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Por que usar um *
quantificador (significando zero ou mais ocorrências) para o init-declarator
? Isso permite que instruções como int;
ou void;
sejam sintaticamente válidas, mesmo que sejam semanticamente inválidas. Eles não poderiam ter usado apenas um +
quantificador (uma ou mais ocorrências) em vez de *
na regra de produção?
Tentei compilar um programa simples para ver o que o compilador gera e tudo o que ele faz é emitir um aviso.
Entrada:
int main(void) {
int;
}
Resultado:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
int
como um tipo de retorno para main
e não use ()
como uma lista de tipos de parâmetros em funções, mas (void)
sim.