Un compilateur est un traducteur de programme écrit dans un langage source à un programme dans
un langage cible.
La compilation se fait dans deux phases :
1. Phase d’analyses : Rencontre les variables, les instructions, les opérateurs, les structures
syntaxiques et les propriétés sémantiques.
2. Phase de synthèse et de production qui devra produire le code cible.
1- Phase d’analyses :
1.1 Analyse lexicale : rencontre le type de mot lus / lire le programme source de gauche à
droite / regroupement de caractères en unités lexicales/ éliminer les caractères superflus
(commentaire, espaces) / Rencontre les bibliothèques qui ne font pas partie à
proprement parler du programme ( # include <stdio.h> (en c) )
Exemple : if (i<a+b) x = 2*x; analyse lexical: « mot-clé séaprateur ident operl dient
operel ident séparateur ident affectation constante operl ident ».
Outils théoriques utilisés : expressions régulières et automates à états finis.
1.2 Analyse syntaxique :
Chaque unité lexicale correspond à une structure grammaticale. L’analyseur syntaxique
sait les règles de construction d’une expression ; une instruction, une fonction etc…
Exemple : un analyseur syntaxique reçoit une suite d’unité lexicale qui contient un seul
séparateur dans une formule mathématique ce qui est incorrect d’où il le signale.
Outils théoriques utilisé : grammaires et automates à pile.
1.3 Analyse sémantique :
C’est la dernière étape dans la phase d’analyse en effet le regroupement lexicale et la
vérification syntaxique est pas largement suffisante en effet if faut que toute ligne de
code doit avoir un sens. (Par exemple en ne peut pas additionner une chaine avec un
entier)
2- Phases de production :
2.1 Génération de code :
Il s’agit de produire les instructions en langage cible.
2.2 Optimisation de code :
Le code cible donne un résultat plus rapide. Il y’a deux types d’optimisation :
- Optimisation ne dépend de la machine cible : élimination du code inutile
(C’est un code correcte mais pas nécessaire)
- Optimisation dépend de la machine cible : remplacez les instructions par d’autre plus
efficaces (utilisation optimale des registres)
3- Phases parallèles :
3.1 Gestion de la table des symboles :
Le table de symboles est la structure de donnée (enregistrement) qui stocke les informations
de chaque identificateur (type / nombre/ visibilité etc.) assure la cohérence entre l’analyse
syntaxique / sémantique / et production de code.
3.2 Gestion des erreurs :
Plusieurs erreur identifier par le compilateur tels que les erreurs syntaxique / sémantique /
système / …
Il faut informer l’utilisateur d’une façon clair / ne s’arrête à compiler s’il détecte une faute.
Chapitre 2 : Analyse lexicale
L’analyse lexicale assure les tâches suivantes :
1- Lecture caractère par caractère du code source.
2- Elimination de l’information inutile et des caractères de décoration.
3- Identification des unités lexicales.
4- Détection des erreurs lexicales.
Une unité lexicale (UL) est une suite de caractères qui a une signification collective.
Exemple d’unité lexicale :
OPEREL : < > + -
IDENT : Var Tab Mat
MOTCLE: if else for while
SEPAR: (;,)
Un modèle (ER) est une règle permet identifier les chaines correspond à une unité de lexical.
Exemple : un modèle de UL IDENT est toute suite de caractères composée de chiffres, lettres ou du
symbole « _ » est qui ne commence pas par un chiffre.
Un lexème toute suite de caractère d’un code source vérifiant le modèle de l’UL.
Exemple les lexèmes « -10 2022 +4 +0 » vérifient le modèle de l’UL NOMBRE ENTIER.
Toute suite de caractère qui ne correspond pas à aucun modèle de l’UL (comme 1i).
Comment corriger ce problème ?
Mode panique : ignorer les caractères qui provoquent le problème.
Transformer le code source : insérer un caractère, remplacé, échanger …
Pour implémenter un analyseur il faut implémenter un programme sur automate