Quando ho esaminato la grammatica BNF di C, ho pensato che fosse strano che la regola di produzione per una dichiarazione fosse simile a questa (secondo https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Perché usare un *quantificatore (che significa zero o più occorrenze) per il init-declarator? Ciò consente a dichiarazioni come int;o void;di essere sintatticamente valide, anche se semanticamente non valide. Non avrebbero potuto semplicemente usare un +quantificatore (una o più occorrenze) anziché *nella regola di produzione?
Ho provato a compilare un semplice programma per vedere cosa genera il compilatore e tutto ciò che fa è emettere un avviso.
Ingresso:
int main(void) {
int;
}
Produzione:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
intcome tipo di ritorno per maine non utilizzare ()come elenco di tipi di parametri nelle funzioni ma (void)invece.