Vous êtes sur la page 1sur 40

Chapitre 4

Analyse sémantique et Contrôle de type

Yousra Hlaoui

Faculté des Sciences de Tunis


Département des Sciences de l’Informatique
Ingénieurs en Informatique

5 / 44
Chapitre VI
Analyse sémantique et Contrôle de type

1 Présentation générale

2 Définition Dirigée par la Syntaxe

3 Évaluation des attributs

4 Contrôle de type

6 / 44
Présentation générale

Présentation générale

Certaines propriétés fondamentales du langage source à traduire


ne peuvent être décrites à l’aide de la seule grammaire car elles
dépendent du contexte.
Par exemple
I on ne peut pas utiliser dans une instruction une variable qui n’a pas
été déclarée au préalable,
I on ne peut pas déclarer deux fois une même variable.
Le rôle de l’analyse sémantique est donc de vérifier ces
contraintes.
Elle se fait en général en même temps que l’analyse syntaxique, à
l’aide d’actions sémantiques insérées dans les règles de
production
I Définitions Dirigées par la Syntaxe (DDS).

7 / 44
Définition Dirigée par la Syntaxe

Définition Dirigée par la Syntaxe

Une définition dirigée par la syntaxe (DDS) est un formalisme


permettant d’associer des actions à une production d’une règle de
grammaire.
Chaque symbole de la grammaire (terminal ou non-terminal)
possède un ensemble d’attributs (variables).
Chaque règle de production de la grammaire possède un
ensemble de règles sémantiques qui permettent de calculer la
valeur des attributs associés aux symboles apparaissant dans la
production.
Une règle sémantique est une suite d’instructions algorithmiques
I Elle peut contenir des affectations, des si-sinon, des instructions
d’affichage,...

8 / 44
Définition Dirigée par la Syntaxe

Définition Dirigée par la Syntaxe

Definition (Définition Dirigée par la Syntaxe)


On appelle définition dirigée par la syntaxe (DDS), la donnée
d’une grammaire non contextuelle et de son ensemble de règles
sémantiques.

On notera X.a l’attribut a du symbole X.


S’il y a plusieurs symboles X dans une production :
I on notera X(0) celui qui est en partie gauche.
I on notera X(1) celui qui est le plus à gauche de la partie droite.
I on notera X(2) celui qui est le deuxième à gauche de la partie droite.
I ...
I on notera X(n) celui qui est le plus à droite de la partie droite.

9 / 44
Définition Dirigée par la Syntaxe

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

S (0) .nba := S (1) .nba + 1


S → aSb
S (0) .nbc := S (1) .nbc

S (0) .nba := S (1) .nba + 1


S → aS
S (0) .nbc := S (1) .nbc

S (0) .nba := S (1) .nba + S (2) .nba + 1


S → cSacS
S (0) .nbc := S (1) .nbc + S (2) .nbc + 2

S →ε S (0) .nba := 0 et S (0) .nbc := 0

S0 → S //Le résultat final est dans S.nba et S.nbc

10 / 44
Définition Dirigée par la Syntaxe

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

Définition Dirigée par la Syntaxe

Definition (Arbre Syntaxique Décoré)


On appelle arbre syntaxique décoré un arbre syntaxique sur les
nœuds duquel on rajoute la valeur de chaque attribut.

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

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 →ε

Cette DDS pose un gros problème : où initialiser les variables ?


I Si on le fait dans l’action sémantique de la règle S → ε, rien ne
nous oblige à exécuter cette initialisation AVANT les actions
d’incrémentation des variables
I Pareil si on rajoute une production S 0 → S
Cette DDS n’est pas valable : il faut utiliser des attributs
13 / 44
Définition Dirigée par la Syntaxe

Définition Dirigée par la Syntaxe

Nous distinguons deux types d’attributs selon leur façon de


calcul : les attributs synthétisés et les attributs hérités

Definition (Attribut Synthétisé)


Un attribut est dit synthétisé lorsqu’il est calculé pour le non
terminal de la partie gauche en fonction des attributs des
symboles de la partie droite.

Exemple 3
Dans l’exemple précédent, nba et nbc sont des attributs
synthétisés.

Calcul : sur l’arbre décoré, la valeur d’un attribut en un nœud se


calcule en fonction des attributs de ses fils (analyse ascendante).
Utilisation : Les attributs synthétisées sont utilisés intensivement
en pratique (yacc/bison)
14 / 44
Définition Dirigée par la Syntaxe

Définition Dirigée par la Syntaxe

Definition (Définition S-attribuée)


Une DDS n’utilisant que des attributs synthétisés est dite
définition S-attribuée.

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

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.

Production Règle sémantique

E →E +T E (0) .val := E (1) .val + T (0) .val

E →T E (0) .val := T (0) .val

T →T ∗F T (0) .val := T (1) .val × F (0) .val

T →F T (0) .val := F (0) .val

F →(E ) F (0) .val := E (0) .val

F → chiffre F (0) .val := chiffre.vallex


0
E →En Imprimer(E.val)

16 / 44
Définition Dirigée par la Syntaxe

Arbre syntaxique décoré pour 3*5+4n


E’

n
E.val =19

E.val =15 + T.val =4

T.val =15 F.val =4

T.val =3 * F.val =5 Chiffre.vallex =4

F.val =3 Chiffre.vallex =5
Chiffre.vallex =3

17 / 44
Définition Dirigée par la Syntaxe

Définition Dirigée par la Syntaxe

Definition (Attribut Hérité)


Un attribut est dit hérité lorsqu’il est calculé à partir des attributs du non terminal
de la partie gauche, et éventuellement des attributs d’autres symboles de la
partie droite.

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).

Definition (Définition L-attribué)


Une DDS n’ayant que des attributs hérités et telle que ces attributs ne
dépendent pas des attributs des frères droits est appelée L-attribuée.
Les définitions L-attribuées comprennent toutes les DDS fondées sur des
grammaires LL(1)

18 / 44
Définition Dirigée par la Syntaxe

Définition Dirigée par la Syntaxe

Exemple 5 - attributs hérités


Une déclaration engendrée par le non-terminal D dans la DDS
suivante consiste en un mot clé entier ou réel, suivi d’une liste
d’identificateurs.

Production Règle sémantique

D→T L L(0) .typeh := T (0) .type

T → entier T (0) .type := entier

T → réel T (0) .type := réel

L(1) .typeh := L(0) .typeh


L → L , id
AjouterType(id.entrée,L.typeh)

L → id AjouterType(id.entrée,L.typeh)

19 / 44
Définition Dirigée par la Syntaxe

Arbre syntaxique avec un attribut hérité

T.type =réel L.typeh =réel

réel L.typeh =réel , id3

L.typeh =réel , id2

id1

20 / 44
Définition Dirigée par la Syntaxe

Schéma de traduction dirigé par la syntaxe

Définition (Schéma de traduction dirigé par la syntaxe)


Un Schéma de Traduction Dirigé par la Syntaxe STDS est une
DDS dans laquelle l’ordre d’exécution des actions sémantiques
est imposé.

Exemple
S 0 → {nba := 0}S S → a{nba := 0}S

Dans un STDS si l’on a :S → α X {une action} Y β


l’action est exécutée après que le sous-arbre syntaxique issu de X
aura été parcouru en profondeur et avant que celui issu de Y ne le
soit.

yacc/bison permet de faire des STDS de grammaires


S-attribuées.
21 / 44
Définition Dirigée par la Syntaxe

Graphe de dépendances

Une DDS peut utiliser à la fois des attributs synthétisés et des


attributs hérités.
Si un attribut b à un nœud d’un arbre syntaxique dépend d’un
attribut c
I alors la règle sémantique définissant b en ce nœud doit être
évaluée après la règle sémantique qui définit c
Les interdépendances entre les attributs hérités et synthétisés
aux nœuds d’un arbre syntaxique peuvent être décrites par un
graphe orienté appelé Graphe de dépendances

Définition (Graphe de Dépendances)


On appelle graphe de dépendances, le graphe orienté
représentant les interdépendances entre les divers attributs. Le
graphe a pour sommet chaque attribut. Il y a un arc de a à b ssi le
calcul de b dépend de a.
22 / 44
Définition Dirigée par la Syntaxe

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

Évaluation des attributs

L’évaluation se fait :
1 Après l’analyse syntaxique
2 Pendant l’analyse syntaxique

Évaluation après l’analyse syntaxique


le calcul des attributs s’effectue sur l’arbre syntaxique déjà
construit par des parcours de cet arbre (avec des aller-retours
dans l’arbre suivant l’ordre d’évaluation des attributs).
Inconvénient : méthode très coûteuse en mémoire (stockage de
l’arbre).
Avantage : on n’est pas dépendant de l’ordre de visite des
sommets de l’arbre syntaxique imposé par l’analyse syntaxique
I une analyse descendante impose un parcours en profondeur du
haut vers le bas, de la gauche vers la droite.
I une analyse ascendante un parcours du bas vers le haut.
26 / 44
Évaluation des attributs

Évaluation des attributs

Evaluation pendant l’analyse syntaxique


on utilisera une pile pour conserver les valeurs des attributs
cette pile pouvant être la même que celle de l’analyseur
syntaxique ou une autre
l’ordre d’évaluation des attributs est tributaire de l’ordre dans
lequel les nœuds de l’arbre syntaxique sont ”crées” par la
méthode d’analyse
I les grammaires S-attribuées ne sont traitées qu’avec une analyse
ascendante
I les grammaires L-attribuées ne sont traitées qu’avec une analyse
descendante

27 / 44
Évaluation des attributs

Évaluation des Attributs Synthétisés

Exemple :Évaluation d’une expression arithmétique avec une


analyse ascendante
Production Règle sémantique Traduction avec une pile

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()

T →T ∗F T (0) .val := T (1) .val × F (0) .val tmpF = depiler()

empiler(tmpF∗tmpT)

T →F T .val := F .val

F →(E ) F .val := E.val

F → nb F (0) .val := nb empiler(nb)

28 / 44
Évaluation des attributs

Évaluation des Attributs Synthétisés

Exemple :Évaluation des Attributs Synthétisés


Analyser le mot 2*(10+3) à l’aide d’un analyseur LR :

29 / 44
Évaluation des attributs

Évaluation des Attributs Hérités

Exemple : Évaluation des Attributs Hérités


Calcul du niveau d’imbrication des ”)” dans un système de
parenthèses bien formé.
Production Règle sémantique Traduction avec une pile

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)

S →ε écrireS.nb écrire dépiler()

I On effectue une analyse descendante en utilisant la table d’analyse


LL(1) suivante :
PREMIER(S’)=PREMIER(S) = {(, ε},
SUIVANT(S’) = {$} et SUIVANT(S) = {), $}

30 / 44
Évaluation des attributs

Évaluation des Attributs Hérités

Exemple :Évaluation des Attributs Hérités


Table d’analyse LL(1)

( ) $
0 0 0
S S →S S →S

S S → (S) S S →ε S →ε

Analysons le mot (()(()))()

31 / 44
Évaluation des attributs

Évaluation des Attributs Hérités

Construction de l’arbre de dérivation du mot (()(()))() :


S’

S S
( )

( S ) S ( S ) S

( S ) S 
 

( S )S 

 
Mot
Généré: ( ( ) ( ( ) ) ) ( )

32 / 44
Évaluation des attributs

Évaluation des Attributs Hérités

Évaluation des attributs calculant le nombre des ”)” dans (()(()))() de


manière informelle :
S’

S Après ce S nous comptons 0 ‘)’

S Après ce S nous comptons 1 ‘)’


S Après ce S nous
( ) comptons 0 ‘)’

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

Évaluation des Attributs Hérités

Évaluation des attributs calculant le nombre des ”)” dans (()(()))() de


manière formelle (1) :
S’ S’.nb=0

S S.nb=0

S S.nb=1 S S.nb=0
( )

( S S.nb=2 ) S S.nb=1 ( 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

Évaluation des Attributs Hérités

Évaluation des attributs calculant le nombre des ”)” dans (()(()))() de


manière formelle (2) :
S’ S’.nb=0

S S.nb=0

S S.nb=1 S S.nb=0
( )

( S S.nb=2 ) S S.nb=1 ( S S.nb=1 ) S S.nb=0

( S S.nb=2 ) S S.nb=1  Afficher 0


Afficher 2   Afficher 2

( S S.nb=3 ) S S.nb=2  Afficher 1

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

Définition (Expression de Type (E.T))


Une Expression de Type dénote le type de toute construction d’un
langage
Une expression de Type est
I Un Type de Base : Booléen, entier, caractère, réel ou
Erreur de type
I Un Nom de Type
I Un Constructeur de Type peut être :
1 Un Tableau
2 Un Produit
3 Une Structure
4 Un Pointeur
5 Une Fonction

37 / 44
Contrôle de type

Expression de Type

Les Constructeurs de Type


1 Tableaux :Si T est une expression de type, alors Tableau(I, T) est une E.T
dénotant le type d’un tableau dont les éléments sont de type T et l’ensemble des
indices est I.
Exemple : La E.T de Var A: array[1..10] of integer est
Tableau(1..10, integer)
2 Produits : Si T1 et T2 sont des E.T alors T1 ∗ T2 est une E.T.
3 Structures : Si T1 , T2 , . . . , Tn sont des E.T alors Structure(T1 , T2 , . . . , Tn ) est une
E.T qui définit une structure à n champs. La déclaration suivante déclare une
nom de type Ligne représentant la E.T
structure((adresse x integer), (lexème x Tableau(1..15, char))
et déclare que la variable table est un tableau de structures de ce type.
TYPE Ligne = record
adresse : integer;
lexème : array[1..15] of char;
end;
var table : array[1..100] of Ligne;
38 / 44
Contrôle de type

Expression de Type

Les Constructeurs de Type


4 Les Pointeurs :Si T est une E.T alors pointeur(T) est une E.T
définissant un pointeur vers un objet de type T.
5 Les Fonctions : f définie du domaine D vers le Codomaine A.
f admet comme type (D.type → A.type).
Si T1 est une E.T et T2 est une E.T alors (T1 → T2 ) est une E.T
dénotant une fonction avec un domaine défini par T1 et un
codomaine défini par T2 .
Exemple : La E.T de la fonction f(a, b: char) : ˆchar;
est char x char → pointeur(char)

39 / 44
Contrôle de type

Spécification d’un Contrôleur de Type Simple

Un Contrôleur de Type pour un Langage Simple


Dans ce contrôleur, tout identificateur doit être déclaré avant que cet
identificateur soit utilisé
Ce contrôleur est un schéma de traduction qui synthétise le type de toute
expression à partir des types de ses sous-expressions
Ce contrôleur peut manipuler des tableaux, pointeurs, instructions et fonctions.

Exemple : Un Langage Simple de Programmation


P → D ; I
D → D ; D | id : T
T → caractère | entier | tableau [ nb ] de T | ↑ T
I → I ; I | id := E | si E alors I | tant que E faire I
E → littéral | nb | id | E mod E | E [ E ] | E ↑

40 / 44
Contrôle de type

Contrôleur de Type des expressions et des instructions

1. Contrôler le type d’un identificateur


Dans le schéma de traduction suivant, l’action associée à la production
D → id : T stocke un type dans l’entrée d’un identificateur dans une table de
symboles.
L’action {AjouterType(id.entr ée, T 0 .type)} est appliquée à :
I l’attribut synthétisé entrée pointant vers l’entrée id dans la table des
symboles, et
I une expression de type représentée par l’attribut synthétisé type du
non-terminal T

Règle de Production Action Sémantique


D → id : T {AjouterType(id.entr ée, T 0 .type)}
T → caractère {T (0) .type := caract ère}
T → entier {T (0) .type := entier }
T → tableau [ nb ] de T {T (0) .type := tableau(1..nb.val, T (1) .type)}
T → ↑ T {T (0) .type := pointeur (T (1) .type)}
41 / 44
Contrôle de type

Contrôleur de Type des expressions et des instructions


2. Contrôler le type des expressions
Dans le schéma de traduction suivant, l’attribut synthétisé type associé au
non-terminal E donne l’expression de type affectée par le système de typage à
l’expression engendrée par E.

Règle de Production Action Sémantique


E → littéral {E 0 .type := caract ère}
E → nb {E (0) .type := entier }
E → id {E (0) .type := Rechercher (id.entr ée)}
{E (0) .type := si E (1) .type = entier et
E → E mod E E (2) .type = entier alors entier
sinon erreur de type}
{E (0) .type := si E (2) .type = entier et
E → E [E ] E (1) .type = tableau(s, t) alors t
sinon erreur de type}
{E (0) .type := si E (1) .type = pointeur (t) alors t
E → E↑
sinon erreur de type}
42 / 44
Contrôle de type

Contrôleur de Type des expressions et des instructions

3. Contrôler le type des instructions


Les instructions n’ont pas généralement de valeur associée. On peut leur
affecter le type spécial vide. Si une erreur est détectée dans une instruction, on
lui affecte le type erreur de type.

Règle de Production Action Sémantique


{I (0) .type := si id.type = E (0) .type alors vide
I → id := E
sinon erreur de type}
{I (0) .type := si E (0) .type = bool éen alors I (1) .type
I → si E alors I
sinon erreur de type}
{I (0) .type := si E (0) .type = bool éen alors I (1) .type
I → tant que E faire I
sinon erreur de type}
{I (0) .type := si I(1).type = vide et
I → I;I I (2) .type = vide alors vide
sinon erreur de type}

43 / 44
Contrôle de type

Contrôleur de Type : Exemple d’Analyse


Table de Symboles
Programme P à analyser
N° lexème type
a : entier;
b : réel; 1 a entier
b := 2.23; 2 b réel
a := b 3 … …
P

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

Vous aimerez peut-être aussi