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;
^~~
int
come tipo di ritorno per main
e non utilizzare ()
come elenco di tipi di parametri nelle funzioni ma (void)
invece.