Sémantique des déclarations

La partie qui nécessite d'être explicitée est la partie de la grammaire concernant les déclarateur. La sémantique est la suivante :
$\bullet$
la seule règle de la grammaire qui dérive vers un terminal est la règle :
déclarateur-direct :
$\Rightarrow$ identificateur
ce qui fait qu'a l'intérieur de tout déclarateur se trouve un identificateur. Cet identificateur est le nom de l'objet déclaré par la déclaration. Exemple :
char c;    /* déclaration de la variable c de type char */

$\bullet$
il y a 3 constructeurs de type :
  1. * est un constructeur permettant de construire des types « pointeur vers ... ».

    Exemple :

    /* déclaration de p de type pointeur vers short int */
    short int *p;
    

  2. ( ) est un constructeur permettant permettant de construire des types « fonction retournant ... ».

    Exemple :

    /* déclaration de sin de type fonction retournant
       un double */
    double sin();
    

  3. [ expression-constante$_{option}$ ] est un constructeur permettant de construire des types « tableau de ... ».

    Exemple :

    /* déclaration de t de type tableau de 32 int */
    int t[32];
    

$\bullet$
les constructeurs de type peuvent se composer et sont affectés de priorités. Les constructeurs ( ) et [ ] ont la même priorité, et celle-ci est supérieure à la priorité du constructeur *.
char *t[10]; /* tableau de 10 pointeurs vers des char */
int *f(); /* fonction retournant un pointeur vers un int */
double t[10][10]; /* tableau de 10 tableaux de 10 double */

$\bullet$
tout comme avec des expressions, la règle :
déclarateur-direct :
$\Rightarrow$ ( déclarateur )
permet de parenthéser des déclarateur de manière à en changer la sémantique :
char *t[10];   /* tableau de 10 pointeurs vers un char */
char (*t)[10]; /* pointeur vers un tableau de 10 char  */

Matthieu Moy 2017-02-08