Académique Documents
Professionnel Documents
Culture Documents
Yousra Hlaoui
5 / 44
Chapitre VI
Analyse sémantique et Contrôle de type
1 Présentation générale
4 Contrôle de type
6 / 44
Présentation générale
Présentation générale
7 / 44
Définition Dirigée par la Syntaxe
8 / 44
Définition Dirigée par la Syntaxe
9 / 44
Définition Dirigée par la Syntaxe
Exemple 1
Soit la grammaire : S → aSb|aS|cSacS|ε
I Attributs : nba : calcul du nombre de a,
nbc : calcul du nombre de c
I une DDS permettant de calculer ces attributs pourrait être :
Production Règles sémantiques
10 / 44
Définition Dirigée par la Syntaxe
Exemple 1 - Suite
On peut dessiner un arbre syntaxique avec la valeur des deux
attributs pour chaque symbole non terminal.
I Calcul du nombre de a et de c pour acaacabb
4S 2 nba
nbc
a 3S 2 b
1S 0
c 1S 0 a c
a 0S 0 0S 0
a b
ε ε
11 / 44
Définition Dirigée par la Syntaxe
Dans une DDS, il n’y a aucun ordre imposé pour l’évaluation des
attributs
Il n’y a aucun ordre spécifique pour l’exécution des actions
sémantiques
Exemple 2
Reprenons l’exemple précédent avec une autre DDS qui ne ferait
pas intervenir d’attributs mais utiliserait de simples variables
12 / 44
Définition Dirigée par la Syntaxe
Exemple 2 - Suite
Production Règles sémantiques
S → aSb nba++
S → aS nba++
nba++
S → cSacS
nbc+=2
S →ε
Exemple 3
Dans l’exemple précédent, nba et nbc sont des attributs
synthétisés.
Exemple 4
Cet exemple décrit comment un constructeur d’analyseurs
syntaxiques LR peut être adapté pour implanter mécaniquement
une définition S-attribuée fondé sur une grammaire LR.
Cet exemple présente une définition S-attribuée spécifiant une
calculatrice de bureau lisant une ligne d’entrée contenant une
expression arithmétique composée de chiffres, de parenthèses,
des opérateurs + et *, et est suivie d’un caractère de fin de ligne
n, puis imprime la valeur de l’expression.
15 / 44
Définition Dirigée par la Syntaxe
Exemple 4 - Suite
Cette définition associe l’attribut synthétisé val de type entier à
chacun des non-terminaux E, T et F.
16 / 44
Définition Dirigée par la Syntaxe
n
E.val =19
F.val =3 Chiffre.vallex =5
Chiffre.vallex =3
17 / 44
Définition Dirigée par la Syntaxe
Calcul : Sur l’arbre décoré, la valeur d’un attribut, à un nœud, se calcule en fonction
des attributs des nœuds frères et du nœud père (analyse descendante).
18 / 44
Définition Dirigée par la Syntaxe
L → id AjouterType(id.entrée,L.typeh)
19 / 44
Définition Dirigée par la Syntaxe
id1
20 / 44
Définition Dirigée par la Syntaxe
Exemple
S 0 → {nba := 0}S S → a{nba := 0}S
Graphe de dépendances
Graphe de dépendances
Exemple 7
Soit la production A → XY ayant la règle sémantique
A.a := f (X .x, Y .y)
Cette règle définit un attribut synthétisé A.a qui dépend des
attributs X .x et Y .y
Dans l’arbre syntaxique utilisant la production, il y aura trois
nœuds A.a, X .x et Y .y dans le graphe de dépendances avec
deux arcs
I un de X .x vers A.a puisque A.a dépend de X .x et
I un autre de Y .y vers A.a puisque A.a dépend de Y .y
Si on a une autre règle sémantique X .h := f (A.a, Y .y) associée à
A → XY alors on aura :
I un arc de A.a vers X .h et
I un autre de Y .y vers X .h puisque X .h dépend à la fois de A.a et
Y .y
23 / 44
Définition Dirigée par la Syntaxe
Graphe de dépendances
Exemple 8
Production Règle sémantique
E →E + E E (0) .val := E (1) .val + E (2) .val
E val
E val + E val
24 / 44
Définition Dirigée par la Syntaxe
Graphe de dépendances
Exemple 9
Le graphe de dépendances suivant est associée à l’arbre syntaxique
de l’exemple 8
D
T Type 4 Typeh 5 L 6
3 entrée
réel Typeh 7 L 8 , id3
2 entrée
Typeh 9 L 10 , id2
id1 1 entrée
25 / 44
Évaluation des attributs
L’évaluation se fait :
1 Après l’analyse syntaxique
2 Pendant l’analyse syntaxique
27 / 44
Évaluation des attributs
tmpT = depiler()
(0) (1) (0)
E →E +T E .val := E .val + T .val tmpE = depiler()
empiler(tmpE+tmpT)
E →T E.val := T .val
tmpT = depiler()
empiler(tmpF∗tmpT)
T →F T .val := F .val
28 / 44
Évaluation des attributs
29 / 44
Évaluation des attributs
S0 → S S.nb := 0 empiler(0)
tmp = depiler()
)
S (1) .nb := S (0) .nb + 1
S → (S) S empiler(tmp) empiler(sommet()+1)
S (2) .nb := S (0) .nb
empiler(tmp+1)
30 / 44
Évaluation des attributs
( ) $
0 0 0
S S →S S →S
S S → (S) S S →ε S →ε
31 / 44
Évaluation des attributs
S S
( )
( S ) S ( S ) S
( S ) S
( S )S
Mot
Généré: ( ( ) ( ( ) ) ) ( )
32 / 44
Évaluation des attributs
Après ce S nous
( S Après ce S nous ) S comptons 1 ‘)’ ( S Après ce S )
S Après ce S
comptons 2 ‘)’ nous nous
comptons comptons
( Après ce S nous 1 ‘)’
S comptons 2 ‘)’
) S Après
nous
ce S
0 ‘)’
comptons
1 ‘)’
Après ce S Après ce S
( S nous )S nous
comptons comptons
3 ‘)’ 2 ‘)’
MOT: ( ( ) ( ( ) ) ) ( )
33 / 44
Évaluation des attributs
S S.nb=0
S S.nb=1 S S.nb=0
( )
( S ) S S.nb=1 Afficher 0
Afficher 2 Afficher 1
( S )S Afficher 1
MOT: ( ( ) ( ( ) ) ) ( )
34 / 44
Évaluation des attributs
S S.nb=0
S S.nb=1 S S.nb=0
( )
Afficher 3 Afficher 2
MOT: ( ( ) ( ( ) ) ) ( )
35 / 44
Contrôle de type
Contrôle de type
Présentation
Si le langage source est un langage typé il faut vérifier la pertinence des types
des objets manipulés dans les phrases du langage
Le compilateur doit alors signaler une erreur si un opérateur est appliqué à un
opérande incompatible.
Exemple
I En C, on ne peut pas additionner un double et un char ou
multiplier un int et un struct
I Certaines opérations sont possibles : affecter un int à un double
ou un char à un int via des conversions implicites
La conception d’un contrôleur de type pour un langage est fondée sur :
I La connaissance des constructeurs du langage
I la notion de type et les règles d’affectation des types aux
constructeurs.
36 / 44
Contrôle de type
Expression de Type
37 / 44
Contrôle de type
Expression de Type
Expression de Type
39 / 44
Contrôle de type
40 / 44
Contrôle de type
43 / 44
Contrôle de type
D ; I I.t:= erreur_de_type
; I I.t:=erreur_de_type
id : T T.t:= entier ; D I.t:= vide I
id := E E.t:= réel
id : T T.t:= réel id := E E.t:= réel
entier
id
réel
nb
44 / 44