• # Grammaire C

    Posté par . En réponse au message L'opérateur unaire * me laisse perplexe (pointeurs sur fonctions principalement). Évalué à 2.

    Je rajoute un commentaire pour préciser que la norme C spécifie et détaille la grammaire formelle du langage (tant et si bien qu'en théorie, on pourrait presque la balancer directement à Lex & Yacc pour recompiler un compilateur, ce qui est précisément la définition de « Y.A.C.C. »).

    Et en ce qui concerne les types en particulier, ceux-ci font l'objet d'une section dédiée : 6.7.6

    6.7.6 Type names
    type-name:
     specifier-qualifier-list abstract-declaratoropt
    abstract-declarator:
     pointer
     pointeropt direct-abstract-declarator
    direct-abstract-declarator:
     ( abstract-declarator )
     direct-abstract-declaratoropt [ type-qualifier-listopt assignment-expressionopt ]
     direct-abstract-declaratoropt [ static type-qualifier-listopt assignment-expression ]
     direct-abstract-declaratoropt [ type-qualifier-list static assignment-expression ]
     direct-abstract-declaratoropt [ * ]
     direct-abstract-declaratoropt ( parameter-type-listopt )
    
    

    Les « opt » en fin de noms de règles sont en fait écrits en indice dans le document PDF. Donc, ici, « pointer » et « pointeropt » sont la même règle.

    On voit, comme c'est l'usage dans la définition de telles grammaires, que les différentes règles font massivement références à elles-mêmes, d'où la récursivité. C'est ce qui te permet de construire des types de plus en plus compliqués, en partant du centre comme expliqué dans nos commentaires précédents.