Techniques de compilation
Leila Jemni Ben Ayed
Ecole Nationale des Sciences de l’Informatique Ecole Nationale des Sciences de l’Informatique
L’objectif de ce cours est d’étendre les connaissances en théorie des L’objectif de ce cours est d’étendre les connaissances en théorie des langages et des automates à la description des langages de programmation et leur analyse syntaxique en vue de leur compilation. Ce cours décrit les concepts fondamentaux des langages de programmation en commençant, dans une première partie, par donner la syntaxe et la sémantique, en insistant davantage sur la syntaxe. La traduction en code intermédiaire et l’environnement d’exécution font l’objet de la deuxième partie.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
1
Techniques de compilation
Introduction à la compilation I. II. Compilateur en une seule passe II. Compilateur en une seule passe III. Analyse syntaxique III. Analyse syntaxique IV. Analyse sémantique V. Traduction en code pour machine abstraite à pile
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
2
I. Introduction à la Compilation
Plan
I.1. Compilateurs I.2. Les Grammaires non contextuelles I.3. Phases de Compilation I.4. Qualité d’un Compilateur I.5. Outils pour la construction de Compilateurs
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
3
I.1. Compilateurs
– Évolution des langages: • Langage machine • Langage assembleur • Langages évolués : C, PASCAL, ADA (Algorithmiques)
PROLOG (Logiques)
• Langages de 4ème génération
– Un compilateur est un programme qui
lit un programme écrit dans un premier langage(langage source) et le traduit en un programme équivalent écrit dans un autre langage (le langage cible).
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
4
I.1. Compilateurs
– Au cours de ce processus de traduction, un rôle du compilateur est de signaler à son utilisateur la présence d’erreurs dans le programme source.
PSource
Compilateur
PAssembleur
Messages d’erreur
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
5
I.2. Exemples de grammaires non I.2. contextuelles contextuelles
1) Une grammaire qui génère l’ensemble des expressions arithmétiques utilisant les opérateurs + et * et
les chiffres {0,1,...9}
G = ({Exp}, {+, *, (, ), 0, 1, …9}, Exp, R}
R = {
Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi Exp fi
Exp + Exp Exp * Exp (Exp) 0 1 1 2 3 4 5 6 7 8 9 }
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
6
I.2. Exemples de grammaires non I.2. contextuelles contextuelles
2) Une grammaire qui génère l’ensemble des expressions booléennes utilisant les opérateurs
arithmétiques (oparith), les opérateurs relationnels (oprel) et les opérateurs booléens (non, et et ou) sur les identificateurs (id) et les nombres entiers (nb)
R = {
Expb fi Expb fi Expb fi Expb fi Expb fi Expr fi Expr fi Expa fi Expa fi Expa fi Expa fi }
Expr non(Expb) Expb et Expb Expb ou Expb Expb ou Expb Expa oprel Expa (Expr) Expa oparith Expa (Expa) id nb
G = (V, T, Expb, R) V = {Expb, Expr, Expa} T = {id, nb, oprel, oparith, non, et, ou, (, )} T = {id, nb, oprel, oparith, non, et, ou, (, )} où
{<, >, <=, >=, <>, =}
oprel ˛ oparith ˛
{+, *, /, -}
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
7
I.2. Exemples de grammaires non I.2. contextuelles contextuelles
3) Une grammaire qui génère une séquence non vide de déclarations suivie de Début, suivie d’une séquence non vide d’instructions suivie de Fin . Chaque instruction peut être une instruction d’affectation (se termine par ;) ou une instruction conditionnelle avec ou sans sinon (qui se termine par FinSi). Les types utilisés sont entier et réel. La séquence générée commence par program suivi d’un nom.
R = {
Program id S_DCL Début S_INST Fin
G = (V, T, P, R)
V = {P, S_DCL, DCL, S_INST, INST, Expb, Expr, Expa} T = {Program, Début, Fin, Var, :, id, :=, ;, Si, Sinon, Fin Si, (, ), oparith, oprel, non, et, ou, entier, réel} oparith, oprel, non, et, ou, entier, réel}
INST | INST S_INST
Var L_id : TYPE; id | id, L_id id | id, L_id entier | réel
P fi S_DCL fi DCL | DCL S_DCL DCL fi L_id fi L_id fi TYPE fi S_INST fi INST fi INST fi INST fi Expb fi Expr fi Expr fi Expa fi Expa fi Expa fi Expa fi }
id := Expa; Si Expb alors S_INST Fin Si Si Expb alors S_INST Sinon S_INST Fin Si Expr | non(Expb) | Expb et Expb | Expb ou Expb Expa oprel Expa (Expr) Exp oparith Exp (Expa) id nb
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
8
I.2. Exemples de grammaires non I.2. contextuelles contextuelles Vérifier que la grammaire précédente génère le
programme suivant :
Program test Var a, b : entier; Début
a:= 10; Si a>= 10 alors a:= 20; Fin Si
Fin
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
9
I.2. Exemples de grammaires non I.2. contextuelles contextuelles Le programme est transformé en une séquence de
terminaux.
Program id Var id, id : entier; Début
id:= nb; Si id oprel nb alors id:= nb; Fin Si
Fin
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
10
I.2. Exemples de grammaires non I.2. contextuelles contextuelles
P
S_DCL
Program
id
DCL Début
S_INST Fin
Var L_id : TYPE ; Var L_id : TYPE ;
INST S_INST INST S_INST
id , L_id entier
id := Expa ;
INST
En parcourant les feuilles de l’arbre de gauche à droite, on trouve le programme à analyser Donc ce programme est syntaxiquement correct
id
nb Si Expb alors S_INST Fin Si
Expr
INST
Expa oprel Expa
id := Expa ;
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
id
nb
nb
11
I.3. Phases de Compilation
On distingue deux parties:
– Analyse
• Partitionne le programme source en ses constituants et
en crée une représentation intermédiaire.
– Synthèse – Synthèse
• Construit
le programme
cible
à partir de
la
représentation intermédiaire.
• L’analyse
utilise
d’une grammaire non contextuelle qui génère des programmes du langage utilisé.
constituants
les
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
12
I.3. Phases de compilation
PSource
Analyse lexicale
Analyse Syntaxique
Analyse sémantique
Génération de code intermédiaire
Optimisation de code
Génération de code machine
Gestion de la table de symboles
Table des identificateurs, mots réservés et constantes
Gestion des Gestion des erreurs
Leila Jemni Ben Ayed
PCible Cours Techniques de Compilation-2012- 2013
13
I.3. Phases de compilation
Les compilateurs comportent ces deux parties.
on
change
de Si machine, on peut ne machine, on peut ne modifier que la partie terminale
Psource
Analyse
Partie frontale
Génération de code intermédiaire
PLI P
Partie terminale
Générateur de code machine
PASS
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
14
I.3. Phases de compilation
Interface avec l’analyseur lexical
Type d’un id Valeur d’un nb Opérateur PPQ pour oprel
Lire caractère
Entrée
Rendre caractère
Passer unité lexicale et ses attributs
Analyseur lexical lexical
Analyseur syntaxique syntaxique
• Pour l’AS, l’AL retourne l’UL • Pour l’Asem, il retourne le type, la portée, … • Pour le traducteur, il retourne la valeur du nombre, l’opérateur utilisé, … • Si C est une variable caractère et le prog source est dans l’entrée standard alors l’instruction C = getchar(); affecte le prochain caractère d’entrée à C et l’instruction ungetc(C, stdin); rend à l’entrée standard stdin la valeur de C. Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
15
I.3. Phases de compilation
Implantation des interactions avec l’analyseur lexical
Utilise getchar(); pour lire un caractère
Rendre caractère En utilisant ungetc(C, stdin)
AnalLex() analyseur analyseur lexical
Retourne une unité lexicale à l’appelant
ValLex
Positionne la variable globale à la valeur de l’unité lexicale
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
16
I.3. Phases de compilation
Analyse du programme source : A chaque langage de programmation est associée une
grammaire non contextuelle. L’analyse comprend quatre phases :
– Phase1: analyse linéaire (ou lexicale) au cours de laquelle – Phase1: analyse linéaire (ou lexicale) au cours de laquelle le flot de caractères formant le programme source est lu de gauche à droite et groupé en unités lexicales qui sont une suite de caractères ayant une signification collective. Ces unités lexicales sont les terminaux de la grammaire.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
17
I.3. Phases de compilation
– L’Al retourne une UL pour l’AS – Pour l’Asem, si l’UL est id alors il retourne une entrée dans la table des identificateurs pour l’identificateur trouvé. – Pour le traducteur, si l’UL est nb, alors il retourne sa valeur • si l’UL est oprel alors il retourne l’opérateur en question • si l’UL est oprel alors il retourne l’opérateur en question l’UL est oparith alors il retourne l’opérateur en • Si
question
– Quand l’analyseur lexical rencontre un identificateur non mot clé, il le cherche dans la table des id. S’il existe alors il retourné l’entrée associée sinon il lui crêt une entrée et retourne le numéro d’entrée.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
18
I.3. Phases de compilation
par exemple si on dispose de la grammaire avec les règles
id opaff Exp
suivantes: P fi Exp fi Les unités lexicales associées au mot : Les unités lexicales associées au mot :
id | nb | (Exp) | Exp oparith Exp
position := initiale + vitesse * 60
Sont: 1) 3) 5) 6)
l’identificateur position L’identificateur initiale L’identificateur vitesse Le signe de multiplication oparith 7) Le nombre nb
2) Le symbole d’affectation opaff 4) Le signe d’addition oparith
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
19
fi fi fi fi fi fi I.3. Phases de compilation
Le lexème est la suite de caractères du fichier source qui forme l’unité lexicale. Le tableau suivant présente les lexèmes et les unités lexicales associées au mot position := initiale + vitesse * 60
Résultat de l’AL
lexème
position
:= :=
initiale
+
vitesse
*
60
id 1
opaff :=
id 2
oparith +
Unité lexicale
Id
Opaff Opaff
Id
Oparith
Id
Oparith
nb
id 3
oparith *
nb 60
Pour l’AS
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
20
I.3. Phases de compilation
Publicité
par exemple si on dispose de la grammaire avec les règles
suivantes: DCL fi
Var L_ID : TYPE; | Var L_ID : TYPE; DCL | e | e
L_ID fi TYPE fi
id | id, L_ID
entier | réel
Les unité lexicales associées au mot (retournées par l’AL à l’AS):
Var a, b: entier; var c: réel;
Sont les suivantes :
Var
id
,
id
:
entier
;
Var
id
:
réel
;
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
21
fi fi fi e e e e e e fi fi fi fi fi fi I.3. Phases de compilation
par exemple si on dispose de la grammaire avec les règles
suivantes: DCL fi
Var L_ID : TYPE; | Var L_ID : TYPE; DCL | e | e
L_ID fi TYPE fi
id | id, L_ID
entier | réel
Table des id de variables
N°
Lexème
Type
1
2 2
3
a
b b
c
entier
entier entier
réel
Si l’AL retourne un résultat à l’AS et l’Asem alors le résultat de
l’AL pour le mot Var a, b: entier; var c: réel; sera :
Var 0
Id 1
, 0
Id 2
: 0
entier 0
; 0
Var 0
Id 3
: 0
réel 0
; 0
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
22
fi fi fi e e e e e e fi fi fi fi fi fi I.3. Phases de compilation
Soit le mot a := c + 34; l’AL retourne Pour l’AS : id := id oparith nb; Pour l’Asem : 1 := 3 oparith nb;
Id 1
:= 0
Résultat de l’AL
Id 3
oparith +
nb 34
; 0
c-a-d entier := réel oparith entier
Pour le traducteur : @a := @c + 34; Pour le traducteur : @a := @c + 34;
N°
1
2
3
Table des id de variables
Lexème
a
b
c
Type
entier
entier
réel
Adresse
@a
@b
@c
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
23
I.3. Phases de compilation
par exemple si on dispose de la grammaire avec les règles
suivantes: P fi DCL fi
fi DCL L_I
Var L_ID : TYPE; | Var L_ID : TYPE; DCL | Var L_ID : TYPE; DCL | e
id | id, L_ID entier | réel
L_ID fi TYPE fi L_I fi
Table des id de variables
N°
Lexème
Type
1
2 2
3
a
b b
c
entier
entier entier
réel
id := nb; | id := id; | id := nb; L_I | id := id; L_I
Si l’AL retourne un résultat à l’AS, l’Asem et le traducteur alors le résultat de
l’AL pour le mot Var a, b: entier; var c: réel; b := 10; sera :
Var 0
Id 1
, 0
Id 2
: 0
entier 0
; 0
Var 0
Id 3
: 0
réel 0
; 0
id 2
:= 0
nb 10
; 0
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
24
fi fi fi fi fi I.3. Phases de compilation
Var a, b: entier; var c: réel; b := 10;
Table des id de variables
N°
Lexème
Type
1
2 2
3
a
b b
c
entier
entier entier
réel
Var 0
Id 1
, 0
Id 2
: 0
entier 0
; 0
Var 0
Id 3
: 0
réel 0
; 0
id 2
:= 0
nb 10
; 0
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
25
I.3. Phases de compilation
Analyse du programme source :
les
sont
unités
lexicales
– Phase2: analyse hiérarchique (ou syntaxique) au cours de regroupées
laquelle hiérarchiquement en structure grammaticale. L’analyse syntaxique consiste à vérifier que la suite d’unités L’analyse syntaxique consiste à vérifier que la suite d’unités lexicales est générée par la grammaire du langage. Ceci revient à construire un arbre d’analyse (ou syntaxique) dont les feuilles concordent avec la suite d’unités lexicales en les parcourant de gauche à droite.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
26
I.3. Phases de compilation
Analyse du programme source :
– Phase3: analyse sémantique au cours de laquelle on opère certain contrôle pour s’assurer que l’assemblage des constituants du programme a un sens. Une des opérations principales d’un Asem est le contrôle de type des le contrôle de type des principales d’un Asem est opérandes d’une opération, le contrôle de la portée des identificateurs sous programme, ….
au moment
l’appel
d’un
de
– Dans le contrôle de type,
l’analyseur sémantique peut insérer des opérations de conversion pour les expr d’entier vers réel.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
27
I.3. Phases de compilation
Analyse du programme source :
– Phase3: analyse sémantique Nous distinguons deux types d’erreurs sémantiques:
• sémantique statique, contrôlée au moment de la compilation telle
que : que :
– Variable non déclarée – l’incompatibilité de type, – la portée d’une variable…
• Sémantique dynamique, contrôlée au moment de l’exécution telle
que :
– la division par zéro – les boucles infinies – le débordement mémoire
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
28
I.3. Phases de compilation
Analyse du programme source :
– Phase4: traduction en code intermédiaire au cours de laquelle la séquence d’instructions du programme est traduite en une séquence d’instructions dans un langage intermédiaire. Par exemple : le langage pour machine à intermédiaire. Par exemple : le langage pour machine à pile, le langage C, …
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
29
I.3. Phases de compilation
Analyse du programme source :
– La table des symboles contient des informations sur les différents symboles et les attributs associés. Par exemple les identificateurs de les mots clés (ou réservés) et variables en spécifiant l’unité lexicale id et leurs attributs: variables en spécifiant l’unité lexicale id et leurs attributs: type, adresse, etc…
– A chaque fois qu’une unité lexicale id est trouvée par l’AL, le lexème associé est inséré dans la table des symboles s’il n’a pas été déjà inséré et l’AL retourne id et un pointeur vers une entrée de la table des symboles.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
30
I.3. Phases de compilation
Exemple
On veut illustrer les phases de compilation sur l’exemple
suivant :
Position := Initiale + Vitesse * 60;
id := Exp; id := Exp;
La grammaire est la suivante : P fi P fi Exp fi id | nb | (Exp) | Exp + Exp | Exp * Exp Une Contrainte sémantique doit être vérifiée :
L’opérateur de multiplication doit être appliqué à deux opérandes de même type (entier, entier) ou (réel, réel) Pour notre exemple, Vitesse est un réel et 60 est un nombre entier, il faut alors convertir 60 d’entier vers réel (60.0)
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
31
I.3. Phases de compilation
• Analyse lexicale
id1 := id2 + id3 * nb;
• Analyse syntaxique
P
id := Exp
;
Exp + Exp
id Exp * Exp
id nb
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
32
I.3. Phases de compilation
• Analyse sémantique Comme vitesse est un réel, un compilateur peut convertir le nombre entier nb en réel pour pouvoir utiliser l’opérateur de multiplication
Var position, Initiale, Vitesse : réel;
Publicité
P
Analyseur Sémantique
id := Exp
Table des id de variables
Exp + Exp
N°
Lexème
Type
1
2
3
Position
Initiale
Vitesse
Réel
Réel
Réel
id Exp * Exp
id 60
entier vers réel 60.0
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
33
I.3. Phases de compilation
• Génération de code intermédiaire Temp1 := Entier vers réel(60); Temp2 := Temp1*id3; Temp3 := id2 + Temp2; id1 := Temp3;
• Optimisation de code Analyse syntaxique • Optimisation de code Analyse syntaxique
Temp1 := id3*60.0; id1 := id2 + Temp1;
• Génération de code intermédiaire (Machine VON NEUMAN)
Machin à registres MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
34
I.4. Qualité d’un compilateur
–Fournir le maximum d’erreurs en
une seule compilation une seule compilation
–Rapidité
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
35
I.5. Outils pour la construction de I.5. Outils pour la construction de compilateurs compilateurs
– Assembleur – Assembleur – Ecriture en langage évolué – Constructeurs automatiques de compilateurs : LEX et YACC
Grammaire non Grammaire non contextuelle du langage
Description des unités lexicales du langage
Leila Jemni Ben Ayed
Générateur automatique d’analyseur syntaxique
Analyseur Syntaxique Écrit en C ou en LPascal
Générateur automatique d’analyseur lexical
Analyseur lexical Écrit en C ou en LPascal
Yacc
Lex
Cours Techniques de Compilation-2012- 2013
36
II. Analyse lexicale
Plan
II.1. Présentation générale II.2. Automates finis et expressions régulières II.2. Automates finis et expressions régulières II.3. Spécification des unités lexicales II.4. Reconnaissance des unités lexicales II.5. Conception d’un générateur d’un analyseur
lexical
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
37
II.1. Présentation générale
• L’analyseur
lexical constitue la première phase d’un compilateur. Sa tâche principale est de lire les caractères d’entrée et de produire comme résultat une suite d’unités lexicales que l’analyseur syntaxique va utiliser.
Programme Source
Lire caractère
Rendre caractère
Analyseur lexical
Passer unité lexicale et ses lexicale et ses attributs
Obtenir prochaine unité lexicale
Table des symboles
Analyseur syntaxique
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
38
II.1. Présentation générale
•
Rq. L’AL est un sous programme de l’AS. A la réception de « prochaine unité », l’AL lit les caractères d’entrée jusqu’à ce qu’il puisse identifier la prochaine unité lexicale.
Unité lexicale : produite la même pour un ensemble de chaines de caractères Modèle d’une unité lexicale : règle qui décrit une unité lexicale (Expression régulière) Lexème : une suite de caractères du PS qui concorde avec le modèle d’une unité
lexicale.
Unité Lexicale
Lexèmes
Description formelle des modèles
const
if
oprel
id
nb
const
if
const
If
< <= = <> > >=
(<+<=+=+<>+>+>=)
Pi compte D2
3 6.780 6.0
lettre(lettre+chiffre)*
Chiffre+ + chiffre+.chiffre+
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
39
II.2. Automates finis et expressions II.2. Automates finis et expressions régulières régulières • Un analyseur lexical est basé sur les systèmes de transition (ou bien les
automates finis)
Un diagramme de transition pour la reconnaissance de >=
Début
0
>
=
1
autre
2
3
return(oprel, PGE)
* return(oprel, PGQ)
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
40
II.2. Automates finis et expressions II.2. Automates finis et expressions régulières régulières
Un diagramme de transition pour la reconnaissance
de >= Début
>
0
=
1
autre
2
3
return(oprel, PGE)
* return(oprel, PGQ)
Ce diagramme fonctionne comme suit: Son état de départ est l’état 0. Dans l’état 0, on lit le prochain caractère de l’entrée. On suit l’arc > depuis l’état 0 vers l’état 1 si le caractère d’entrée est >. Sinon, on n’a réussi à reconnaître ni > ni >=. En atteignant l’état 1, on lit le prochain caractère d’entrée. L’arc étiqueté = entre l’état 1 et l’état 2 doit être suivi si le caractère d’entrée est = et le diagramme reconnaît >= (PGE). Autrement, l’arc étiqueté autre conduit à l’état 3. Le diagramme reconnaît ainsi > (PGQ) et recule d’un caractère dans l’entrée. On utilise une * pour signaler les états dans lesquels ce recul dans l’entrée doit être fait.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
41
II.2. Automates finis et expressions II.2. Automates finis et expressions régulières régulières
Un diagramme de transition pour la
reconnaissance des opérateurs de relation
Début
0
<
1
=
>
=
>
autre
2
3
4
return(oprel, PPE)
return(oprel, DIF)
* return(oprel, PPQ)
5
return(oprel, EGA)
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
6
=
autre
return(oprel, PGE)
* return(oprel, PGQ) 42
7
8
II.2. Automates finis et expressions II.2. Automates finis et expressions régulières régulières Un diagramme de transition pour la reconnaissance
des identificateurs et des mots clés
lettre, chiffre
Début
0
lettre
autre
1
* *
2
return(UnilexId(), RangerId())
L’action spécifiée par le symbole * permet de reculer d’une position sur le
fichier source après la consommation d’un symbole autre qu’une lettre ou un chiffre.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
43
II.2. Automates finis et expressions II.2. Automates finis et expressions régulières régulières
Les fonctions RangerId() et UnilexId()
-
-
La fonction RangerId() a accès au tampon où l’unité lexicale identificateur a été localisée. On examine la table des symboles et si on trouve le lexème avec l’identificateur mot clé, RangerId() rend 0. Si on trouve le lexème comme variable du programme, RangerId() rend un pointeur vers une entrée dans la table des symboles. Si on ne trouve pas le lexème dans la table des symboles, il y est placé en tant que variable et un pointeur vers cette nouvelle entrée est retourné. variable et un pointeur vers cette nouvelle entrée est retourné. La fonction UnilexId() recherche le lexème dans la table des symboles. Si le lexème est un mot clé, l’unité lexicale correspondante est retournée; autrement, l’unité lexicale id est retournée.
NB. 1)
2)
Le diagramme de transition ne change pas si on doit reconnaître de nouveaux mots clés; on initiale simplement la table des symboles avec les nouvelles chaines et les nouvelles unités lexicales. En pratique, la table des symboles peut être répartie sur deux tables: table des mots clés et table des identificateurs de variables.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
44
II.3. Spécification des unités lexicales
Expressions régulières Les expressions régulières sont une notation importante pour
spécifier des modèles d’unités lexicales.
Exemples: Soit L l’ensemble {A, B, …, Z, a, b, …z} et C l’ensemble {0, 1, …9} L+C ou(L ¨ C) est l’ensemble des lettres et des chiffres L+C ou(L ¨ C) est l’ensemble des lettres et des chiffres 1. 1. LC est l’ensemble des chaines formées d’une lettre suivie 2. d’un chiffre L4 est l’ensemble des chaines de quatre lettres L* est l’ensemble de toutes les lettres, y compris e , la chaine vide. L(L+C)* est l’ensemble de toutes les chaines de lettres et de chiffres commençant par une lettre. C+ est l’ensemble de toutes les chaines d’au moins un chiffre (représentations décimales des entiers naturels)
3. 4.
6.
5.
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
45
II.3. Spécification des unités lexicales
Définitions régulières Soit S un alphabet de symboles de base, une définition régulière est une suite de
définitions de la forme :
r1 r2
d1 d2 …… dn Où chaque di est un nom distinct et chaque ri est une expression régulière sur les
rn
symboles de S
{d1, d2, …, di-1}
Exemples: Lettre fi chiffre fi id fi
A|B|…|Z|a|b|…|z 0|1|…|9
Lettre(Lettre + Chiffre)*
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
46
fi fi fi ¨ II.4. Reconnaissance des unités II.4. Reconnaissance des unités lexicales lexicales
Nous utilisons les diagrammes de transition pour reconnaître des unités lexicales Exemple: Considérons le fragment de la grammaire suivant: Instr fi
si expr alors instr
| si expr alors instr sinon instr | id opaff id pv | id opaff nb pv | id opaff nb pv
terme oprel terme
| terme
id | nb
expr fi
terme fi
Où si, alors, sinon, oprel, id et nb engendrent les ensembles de chaines données par
les définitions régulières suivantes: si fi si alors fi sinon fi oprel fi id fi
alors sinon < | <= | = | <> | > | >=
lettre(lettre|chiffre)*
nb fi opaff fi pv fi
chiffre+ :=
;
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
47
II.4. Reconnaissance des unités II.4. Reconnaissance des unités lexicales lexicales
Le mot en entrée dans le fichier source est le suivant :
si a1 >= b alors a1
10;
:=
N°
lexème
type
Mots clés
1 1
2
3
a1 a1
Publicité
b
…
… …
…
…
si si
alors
L’analyseur lexical retourne la séquence suivante d’unités lexicales avec leurs attributs:
si 0
id 1
oprel PGE
id 2
alors 0
id 1
opaff :=
nb 10
pv ;
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
48
II.4. Reconnaissance des unités II.4. Reconnaissance des unités lexicales lexicales Rq. On suppose que les lexèmes sont séparés par un espace consistant d’une suite non vide de blancs, tabulations et fins de lignes. Notre analyseur lexical doit éliminer ces espaces en comparant une chaine avec la définition régulière suivante :
Délim fi Délim fi bl fi
délim+
blanc | tabulation | fin de ligne blanc | tabulation | fin de ligne
Si l’analyseur lexical trouve une correspondance avec bl, il ne retourne pas l’unité lexicale à l’analyseur l’unité syntaxique. lexicale qui suit le blanc et le retourne à l’analyseur syntaxique.
Il continue pour
rechercher
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
49
fi fi fi fi fi fi fi fi fi II.4. Reconnaissance des unités lexicales Système de transition associé à un analyseur lexical
bl, tab, \n
l
Début
0
Echec()
autre
EOF
l, c
3
1
5
c
< <
=
>
autre
c
2
autre
= =
>
autre
9
*
return(UnilexId(), RangerId())
4
* return(nb, val)
return(oprel, PPE) return(oprel, PPE)
return(oprel, DIF)
6
7
* return(oprel, PPQ)
8
return(oprel, EGA)
14
13
return(EOF, 0)
10
=
autre
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
return(oprel, PGE)
* return(oprel, PGQ) 50
11
12
II.4. Reconnaissance des unités lexicales Système de transition associé à un analyseur lexical
Init(Val)
bl, tab, \n
l
l, c
1
Début
0
Add(Val, c)
c
3
autre
2 Add(Val, c) c
autre
*
return(UnilexId(), RangerId())
4
* return(nb, conv(val))
return(oprel, PPE) return(oprel, PPE)
return(oprel, DIF)
6
7
Erreur()
autre
EOF
5
< <
=
>
= =
>
autre
9
* return(oprel, PPQ)
8
return(oprel, EGA)
14
13
return(EOF, 0)
10
=
autre
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
return(oprel, PGE)
* return(oprel, PGQ) 51
11
12
II.4. Reconnaissance des unités lexicales Code C d’un analyseur lexical
Unilex AnalLex() /* Unilex est une chaine si Alalex retourne uniquement l’unité lexicale*/
{
/* Unilex est un entier si Analex retourne l’unité lexicale et chaque unité est définie comme une
constante*/ While(1) /* Unilex est un enregistrement si Analex retourne l’unité lexicale et un attribut*/
{
Switch(etat) Switch(etat) {
case 0: Init(Chaine); car = carsuivant();
if(car == ‘ ‘ || car == ‘\t’ || car = ‘\n’) { etat = 0; debutlex ++; } else if( car == ‘<‘) etat = 5; else if (car == ‘=‘) etat = 9; else if (car == ‘>’) etat = 10; else if (isletter(car)) Ajouter(car, chaine); etat = 1; else if(isdigit(car)) Ajouter(car, chaine); etat = 3; else if(car == EOF) etat = 13; else Erreur();
case 1: car = carsuiv();
if(isletter(car) || isdigit(car))
ajouter(car, chaine);;
else etat = 2; break;
case 2: Reculer(1); RangerId(); return(UniLexId()); /* cas où l’analyseur lexical retourne uniquement cas où l’analyseur lexical retourne uniquement */l’unité lexicale sinon, il faut utiliser un enregistrement (symbole)*/
………….
case 3: car = carsuiv();
if(isdigit(car)) ajouter(car, chaine); else etat = 4; break;
case 4 : Reculer(1); Return(NB); case 6: Return(Oprel);
…………… case 13: Return(EOF); }
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
52
II.4. Reconnaissance des unités lexicales Code C d’un analyseur lexical (cas du retour d’un enregistrement dans une variable globale symbole à deux champs (UL, Att))
Unilex AnalLex() /* Unilex est une chaine si Alalex retourne uniquement l’unité lexicale*/
{
/* Unilex est un entier si Analex retourne l’unité lexicale et chaque unité est définie comme une
constante*/ While(1) /* Unilex est un enregistrement si Analex retourne l’unité lexicale et un attribut*/
{
Switch(etat) Switch(etat) {
case 0: Init(Chaine)car = carsuivant();
if(car == ‘ ‘ || car == ‘\t’ || car = ‘\n’) { etat = 0; debutlex ++; } else if( car == ‘<‘) etat = 5; else if (car == ‘=‘) etat = 9; else if (car == ‘>’) etat = 10; else if (isletter(car)) etat = 1; else if(isdigit(car)) etat = 3; else if(car == EOF) etat = 13; else Erreur();
case 1: car = carsuiv();
if(isletter(car) || isdigit(car))
ajouter(car, chaine);;
else etat = 2; break;
case 2: Reculer(1); symbole.att = RangerId(); case 2: Reculer(1); symbole.att = RangerId(); symbole.UL = UniLexId(); Return(Symbole); ………….
case 3: car = carsuiv();
if(isdigit(car)) ajouter(car, chaine); else etat = 4; break;
case 4 : Reculer(1); symbole.UL=NB; symbole.Att = toupper(chaine)); Return(symbole); case 6: symbole.UL = Oprel; symbole.att = PPE; Return(symbole); case 13: symbole.UL = EOF; symbole.att = 0; Return(symbole);} On peut retourner des numériques.
……………
53
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
II.4. Reconnaissance des unités lexicales II.4. Reconnaissance des unités lexicales Code C d’un analyseur lexical qui élimine les espaces et collecte les nombres les nombres
#include <stdio.h> #include <ctype.h> Int NumLigne = 1; Int Vallex = RIEN;
Int AnalLex() {
int T; While(1); { {
T = getchar(); if (T == ‘ ‘ || T == ‘\t’) ; else if (T == ‘\n’)
NumLigne ++;
else
if(isdigit(T)) {
Vallex = T-’0’;; T = getchar();
While (isdigit(T)) {
ValLex = ValLex*10+T-’0’; T = getchar(); T = getchar();
} ungetc(T, stdin); return NB;
} Else
ValLex = RIEN;
Return T;
}
}
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
54
II. Compilateur en une seule passe
Plan
II.1. Présentation générale II.2. Définition de la syntaxe II.3. Traduction dirigée par la syntaxe II.4. Un traducteur pour les expressions II.5. Analyse lexicale
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
55
II.1. Présentation générale
Un compilateur en une seule passe est un compilateur qui fait le
parcours du fichier source une seule fois.
L’analyseur lexical fournit un résultat aussi bien à l’analyseur
syntaxique, sémantique qu’au traducteur en code intermédiaire.
Il fournit ainsi: - - - -
Les unités lexicales à l’analyseur syntaxique Les unités lexicales à l’analyseur syntaxique Les types des identificateurs à l’analyseur sémantique et Les attributs des unités au traducteur en langage intermédiaire - Si l’unité est un nombre alors l’attribut est la valeur de ce nombre - Si l’unité est un opérateur arithmétique alors l’attribut est l’opérateur
en question (+, -, /, *)
- Si l’unité est oprel alors l’attribut est l’opérateur en question
(PPQ, PPE, PGQ, PGE, EGA, DIF)
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
56
II.2. Définition de la syntaxe
• Consiste en une grammaire non contextuelle
– C’est une grammaire (V, T, S, R) où
• V est l’ensemble des symboles non terminaux • T est l’ensemble des terminaux • S est le symbole de départ où l’axiome de la grammaire • S est le symbole de départ où l’axiome de la grammaire • R est l’ensemble des règles de production de la forme A fi
u où u ˛
(V + T)*
• Un programme est syntaxiquement correct s’il peut être généré par
la grammaire associée au langage de programmation
•
Si le langage est l’ensemble des instructions d’affectation, alors un élément de l’ensemble est une instruction d’affectation Une grammaire possible est la suivante:
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
57
II.2. Définition de la syntaxe
Soit la grammaire non contextuelle G = (V, T, INST, R) où V = {INST, EXP} T = {id, :=, +, -, *, /, (, ), ;} INST fi R = { EXP fi | (EXP) | (EXP)
id := EXP; id | nb | EXP + EXP | EXP * EXP | EXP – EXP | EXP / EXP } }
INST est l’axiome de la grammaire. Un mot est généré par la grammaire si en
partant de l’axiome (le symbole de départ) et en appliquant successivement des règles de production, nous obtenons le mot (formé par une séquence de terminaux)
Par exemple le mot suivant est généré par la grammaire:
Id := id + (id*nb);
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
58
II.2. Définition de la syntaxe
Parce que on a: INST
id := EXP; id := EXP + EXP ; id := id + EXP ; id := id + EXP ; id := id + (EXP) ; id := id + (EXP * EXP) ; id := id + (id * EXP) ; id := id + (id * nb) ;
Leila Jemni Ben Ayed
Cours Techniques de Compilation-2012- 2013
59
fi fi fi fi fi fi fi fi II.2. Définition de la syntaxe
Si le langage est formé par l’ensemble des séquences non vides d’instructions où chaque instruction est une instruction d’affectation alors une grammaire possible est la suivante :
LISTE_INST fi INST fi EXP fi EXP fi
INST | INST LISTE_INST
id := EXP; id | nb | EXP + EXP | EXP * EXP | EXP – EXP | EXP / EXP | (EXP) id | nb | EXP + EXP | EXP * EXP | EXP – EXP | EXP / EXP | (EXP)
LISTE_INST est l’axiome de la grammaire. Un mot est généré par la gramm