Règle 1 :
<Programme> : < int-declarateurs> < liste-fonctions’>
La règle 1 est bonne car il ne présente qu’un seul choix.
Règle 2 :
< int-declarateurs> : int identificateur <declaration> | epsilon
On a premier(int identificateur <declaration>) ∩ { epsilon } = ∅ .
D’autre part, int identificateur <declaration> est non annulable avec premier(< int-declarateurs>) =
{int, epsilon} et suivant(< int-declarateurs>) = {void, extern}
d’où premier(< int-declarateurs>) ∩ suivant(< int-declarateurs>) = ∅.
Alors la règle 2 est bonne.
Règle 3 :
On a premier(<liste-declarateurs>) = { ‘[‘ , ‘,’ } et premier(<fonction>)= { ‘(‘ } et donc premier(<liste-
declarateurs>) ∩ premier(<fonction>)∅.
Et comme les deux sont non annulables alors le règle 3 est bonne.
Règle 4:
<liste-declarateurs> : <declarateur> <liste-declarateurs’>
La règle 4 est bonne car il représente qu’un seul choix.
Règle 5:
<liste-declarateurs’> : , <declarateur> <liste-declarateurs’> | epsilon
On l’intersection des premiers des deux sous-règles de <liste-declarateurs’> est l’ensemble vide ; et
comme une seule est non annulable, on a :
Premier(<liste-declarateurs’>) = {‘,’, epsilon} et
suivant(<liste-declarateurs’>) = {void, extern} d’où l’intersection est l’ensemble vide.
Alors la règle 5 est bonne.
Règle 6:
On l’intersection des premiers des deux sous-règles de <liste-declarateurs’> est l’ensemble vide ; et
comme une seule est non annulable, on a :
Premier(<declarateur>) = {‘[’, epsilon} et
suivant(<declarateur>) = {void, extern, ‘,’} d’où l’intersection est l’ensemble vide.
Alors règle 6 est bonne.
Règle 7:
On l’intersection des premiers des deux sous-règles de <liste-declarateurs’> est l’ensemble vide ; et
comme une seule est non annulable, on a :
Premier(<declarateur’>) = {‘[’, epsilon} et
suivant(<declarateur’>) = suivant(<declarateur>) = {void, extern, ‘,’} d’où l’intersection est
l’ensemble vide. Alors règle 7 est bonne.
Règle 8:
<fonction> : ( <liste-parms> ) { <liste-declarations> < liste-instructions>}