Académique Documents
Professionnel Documents
Culture Documents
lexicale
Enseignant: Manel Ben Salem
2022-20231
Plan de cour Techniques de compilation
Chapitre 2: Analyse lexicale 2
1. Introduction
2. Types d'analyseurs lexicaux
3. Tâches effectuées par un analyseur lexical
4. Unités lexicales et lexèmes
5. Approches de construction d'un analyseur lexical
1. Introduction Techniques de compilation
Chapitre 2: Analyse lexicale 3
• L'analyseur lexical permet de lire un programme source et de produire comme résultat une suite
d'unités lexicales (séquences de caractères significatives) utilisable par l'analyseur syntaxique;
• A chaque unité lexicale, il associe un couple (type, valeur);
• Pour une grammaire donnée, les différents symboles terminaux représentent les types de
lexèmes constituant les symboles terminaux de la grammaire du langage.
• Les symboles terminaux de la grammaire (ou types de lexèmes) constituent l’interface entre l’analyseur
lexical et l’analyseur syntaxique. Ils doivent être connus des deux.
2. Types d'analyseurs lexicaux Techniques de compilation
Chapitre 2: Analyse lexicale 4
✓ Un analyseur lexical permet de transformer un code source (suite de caractères) en une suite d'unités
lexicales.
✓ Deux approches possibles:
• Analyse lexicale de la totalité du code source à la fois. En effet, en une première étape
l'analyseur permet d'identifier les unités lexicales puis d'engendrer un fichier contenant une suite des
unités lexicales. Ce dernier sera sauvegardé dans une mémoire secondaire et sera utilisé comme entrée
d'une deuxième étape d'analyse syntaxique.
Analyseur
Code source Analyseur lexical Unités lexicales
syntaxique
2. Types d'analyseurs lexicaux Techniques de compilation
Chapitre 2: Analyse lexicale 5
• Analyse lexicale à la demande. L'analyseur lexical et syntaxique travaillent en harmonie de façon que
l'analyseur syntaxique fait appel à l'analyseur lexical pour lui fournir une unité lexicale durant son
avancement. Les deux analyseurs doivent exister ensemble en mémoire.
Analyseur
Code source Analyseur lexical Arbre syntaxique
syntaxique
• Définition : Une unité lexicale désigne une suite de symboles qui a une signification collective.
Exemple :
✓ Les chaines >, <, ≤, ≥ sont des opérateurs relationnels
✓ Les chaines ind, tab sont des identificateurs (des variables ou des fonctions), l'unité lexicale est IDENT.
• Définition: Un modèle est une règle associée à une unité lexicale qui décrit l'ensemble des chaines
du programme qui peuvent correspondre à cette unité lexicale.
• Définition: On appelle lexème toute suite de symboles du programme source qui concorde avec le
modèle d'une unité lexicale.
Exemple:
L'unité lexicale IDENT en C a pour modèle: toute suite non vide de caractères composée de chiffres, des
lettres ou "_" et qui commence par lettre (lexèmes : i, a1, ajouter_valeur, …
Pour décrire le modèle d'une unité lexical de manière formelle, on utilisera les expressions régulières.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 8
• Pour un analyseur lexical basé sur les diagrammes de transition, une chaine de caractères est acceptée s'il y
en a un chemin possible, à travers les transitions, qui mène du premier symbole vers le dernier.
• La construction du diagramme de transition présente une étape préparatoire à la réalisation de l'analyseur. En
effet, le diagramme est transformé en algorithme permettant la reconnaissance des unités lexicale. Cet
algorithme décrit les suites des transitions possibles pour la reconnaissance des unités lexicales.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 9
• Un diagramme de transition est un diagramme (graphe) contenant des états représentés par des cercles
numérotés et des transitions entre ces états représentés par des arcs étiquetés.
• Chaque état du diagramme représente un état de l'analyseur lexical et chaque arc représente une
transition réalisée par l'analyseur lexical lors de la rencontre du symbole de l'étiquette de l'arc.
• La reconnaissance d'une unité lexicale mène l'analyseur à passer d'un état à un autre.
✓ Un arc étiqueté par autre signifie tout symbole à part ceux indiqués sur les étiquètes des autres arcs
sortants du même état.
✓ Les diagrammes de transitions sont déterministes.
Exemple :
On cherche à représenter l'unité lexicale nombre réel non signé (10.5, 123, 3.5E-2, 5.12E+4, …) à travers sa
représentation par une expression régulière et un diagramme des transitions.
• Chiffre=0|1|2|3|4|5|6|7|8|9 OU BIEN [0-9]
• Chiffres=Chiffre Chiffre* OU BIEN Chiffre+
• FractionOpt=.Chiffres|ε OU BIEN (.Chiffres)?
• ExposantOpt=(E(+|-|ε)Chiffres)|ε OU BIEN (E(+|-)?Chiffres)?
• Nbreel=Chiffres FractionOpt ExposantOpt
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 11
Exemple :
Nbreel=Chiffre Chiffre*(.Chiffre Chiffre*)? (E(+|-)?Chiffre Chiffre*)?
Cette forme peut être représentée par le diagramme de transitions suivant :
E
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 12
On peut définir une approche de construction d'un analyseur lexical basé sur les automates à états finis si on admet
les propositions démontrables suivantes :
• L'ensemble des unités lexicales d'un langage constitue un langage régulier L.
• Chaque expression régulière admet un automate à états finis non déterministe.
• Un langage L accepté par un automate à états finis non déterministe admet un automate à états
finis déterministe l'acceptant.
Démarche générale d'implémentation d'un analyseur lexical basé sur les automates à états finis :
1. Spécification des unités lexicales : chaque type d'unité lexicale est spécifié par une expression régulière.
2. Transformation des expressions régulières en automates à états finis (non déterministe éventuellement).
3. Réunion des automates à états finis par construction de l'automate de l'union des tous les automates de
l'étape 2.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 14
Démarche générale d'implémentation d'un analyseur lexical basé sur les automates à états finis :
4. Déterminisation de l'automate de l'union.
5. Minimisation de l'automate déterministe obtenu lors de l'étape 4.
6. Implémentation de l'automate minimal.
La transformation d'un automate à états finis en un analyseur lexical correspond à l'association entre une unité
lexicale et un état final. En effet, une chaine acceptée (après passage de l'état initial vers un état final) est
directement liée à l'unité lexicale correspondante à l'état final (chaque état final signifie la reconnaissance d'une
unité lexicale).
Remarque : La reconnaissance d’une unité lexicale par un AFD est plus rapide (une seule transition par état), alors
que le nombre d’états d’un AFD peut être exponentiel par rapport au nombre d’états de l’AFN.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 15
AFN AFD
Temps de Elevé (lié aux retours en arrière) Réduit (un seul chemin possible )
reconnaissance
Espace occupé Nombre d'états réduit par rapport à Nombre d'états élevé par rapport à un
un AFD AFN
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 16
L'utilisation d'un générateur d'analyseur lexical permet de simplifier l'approche d'analyse lexicale. En effet,
l'utilisateur se limite à présenter une définition exacte pour chaque unité lexicale du langage et le générateur
sera chargé de générer le code source de l'analyseur lexical.
Le générateur LEX fournit un analyseur lexical en langage C à partir des définitions des unités lexicales
écrites en langage LEX. Le noyau LEX crée l'automate à états finis représentant toutes les unités lexicales définies
et permettant la recherche des unités lexicales dans le texte entrée par l'utilisateur.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 17
La définition des unités lexicales à travers le langage LEX est écrite dans un programme LEX qui comporte
essentiellement 3 parties :
%{
Déclaration de variables, constantes,
%}
Déclaration de définitions régulières
%%
Règles de traduction
%%
Bloc principal et fonctions auxiliaires
• La première partie comporte les déclarations des variables, des constantes et des définitions régulières
utilisées comme composantes des expression régulières qui apparaissent dans les règles de traduction.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 18
• Les règles de traduction sont des instructions (en langage C) de la forme "exp action", où chaque "exp" est
une expression régulière et chaque "action" est un bloc d'instructions en C indiquant quelle action
l'analyseur lexical doit réaliser lorsque une unité lexicale concorde avec le modèle de l'expression.
• La section du bloc principal et fonctions auxiliaires est facultatif contenant les routines définis par
l'utilisateur qui pourraient être utiles dans les actions.
Merci de votre
attention
19