En parcourant la grammaire BNF de C, j'ai trouvé étrange que la règle de production d'une déclaration ressemble à ceci (selon https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Pourquoi utiliser un *
quantificateur (signifiant zéro ou plusieurs occurrences) pour le init-declarator
? Cela permet aux instructions telles que int;
ou void;
d'être syntaxiquement valides, même si elles sont sémantiquement invalides. Ne pouvaient-ils pas simplement utiliser un +
quantificateur (une ou plusieurs occurrences) au lieu de *
dans la règle de production?
J'ai essayé de compiler un programme simple pour voir ce que le compilateur produit et il ne fait qu'émettre un avertissement.
Contribution:
int main(void) {
int;
}
Production:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
la source
int
comme type de retour pourmain
et ne pas utiliser()
comme liste de types de paramètres dans les fonctions mais à la(void)
place.Réponses:
declaration-specifier
comprendtype-specifier
, qui comprendenum-specifier
. Une construction commeest valide
declaration
sansinit-declarator
.Des constructions comme celles-ci
int;
sont exclues par des contraintes au-delà de la grammaire :Je suppose qu'il existe des raisons de compatibilité descendante derrière votre compilateur émettant uniquement un avertissement.
la source
Une déclaration sans déclarateur init:
est inoffensif pour les listes de spécificateurs de déclaration qui ne sont pas un seul spécificateur
enum
/struct
/union
et il correspond utilement à ceux qui le sont.Dans tous les cas, la grammaire présentée correspondra également à tort aux déclarations comme
int struct foo x;
oudouble _Bool y;
(elle autorise plusieurs spécificateurs afin de faire correspondre des choses commelong long int
), mais tout cela peut être détecté plus tard, dans un contrôle sémantique.La grammaire BNF elle-même n'éliminera pas toutes les constructions illégales.
la source