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;
^~~
intcomo um tipo de retorno para maine não use ()como uma lista de tipos de parâmetros em funções, mas (void)sim.