Académique Documents
Professionnel Documents
Culture Documents
Concepts de base
SMI
2017
A. SOUHAR
1
Un compilateur
Logiciel qui transforme un programme écrit dans un
langage de haut niveau en instructions exécutables.
Erreurs de
compilateur compilation
Pg objet
assembleur
Référence à des appels de
Code relogeable routine, compilation séparée…
(Pascal, C , C++, …)
Texte source du
compilateur en langage Compilateur Code exécutable
d’implémentation du compilateur
Compilateur
Texte
source
Architecture d’un Compilateur
Un compilateur est donc découpé en plusieurs phases.
Chaque phase constitue une partie de la traduction.
Analyseur lexical.
Analyseur syntaxique.
Analyseur sémantique.
Analyseur lexical
Inspecte le texte source caractère par caractère et
élimine les superflus.
SMI
2017
A. SOUHAR
1
Structure d’un compilateur
Texte
source
Compilateur
Texte
source
Représentation intermédiaire
Un compilateur analyse ses données, en construit une
représentation sémantique et synthétise ses résultats à
partir de cette représentation.
Optimisation du code.
Génération du code intermédiaire
Le paradigme analyse - synthèse est très puissant et
d’application générale.
Langage 2 Machine 2
Représentation
. Intermédiaire .
. .
. .
Langage L Machine
M
Génération du code intermédiaire
En pratique pour plus de portabilité, la face arrière est
remise à l’exécution.
Code source en L1
Face avant
ne dépend
que de L1
Code en langage
Intermédiaire
Exécution
Machine
Virtuelle
Optimisation du code
Elimination des opérations inutiles pour produire un
code plus efficace.
Exemples:
Détecter l’inutilité de recalculer des expressions dont la valeur
est connue,
SMI
2017
A. SOUHAR
2
Analyse lexicale
Consiste à lire des caractères d’entrée et de produire une
suite des mots (unités lexicales). Détecte et supprime les
caractères superflus (espaces, fin de lignes , …)
lettre(lettre|chiffre)* , <= et if
Le lexème:
Nombre:
Symboles simples:
On dispose de 3 solutions :
1. l’écrire à la main,
SMI
2017
A. SOUHAR
3
Langage
L1 = L2 si et seulement si
désigne
désigne
désigne
désigne
Analyseur lexical
le problème de la reconnaissance des unités lexicales INFEG, DIFF,
INF, EGAL, SUPEG, SUP, IDENTIF, respectivement définies par les
expressions régulières <=, <>, <, =, >=, > et lettre(lettre|chiffre)*
#define IDENTIF 1
#define NOMBRE 2
#define SI 3
#define ALORS 4
#define SINON 5
etc.
Analyseur lexical
else if (estLettre(c)) { lonLex = 0;
int uniteSuivante(void)
lexeme[lonLex++] = c; c = lireCar();
{ char c; c = lireCar();
while (estLettre(c) || estChiffre(c))
while (estBlanc(c)) c = lireCar();
{ lexeme[lonLex++] = c;
if (c == '<') { c = lireCar();
c = lireCar(); }
if (c == '=') return INFEG;
delireCar(c); return IDENTIF; }
else if (c == '>') return DIFF;
else { delireCar(c); return NEANT;} }
else { delireCar(c); return INF; } }