Vous êtes sur la page 1sur 19

Chapitre 2: Analyse

lexicale
Enseignant: Manel Ben Salem

Niveau: 2ième Licence SI

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.

Unités lexicales (symboles)

Analyseur
Code source Analyseur lexical Arbre syntaxique
syntaxique

Demande prochaine unité


lexicale
3. Tâches effectuées par un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 6

L'analyseur lexical effectue un ensemble de tâches dont on peut citer:


1. Lecture du code source : l'analyseur lit le fichier de code source caractère par caractère. Il peut éliminer
également les caractères inutiles comme les espaces, les tabulations, les commentaires, les caractères de fin
de ligne, … et détecter les erreurs liées à l'existence d'un caractère non permis.
2. Concaténation des caractères pour construire les unités lexicales. L'analyseur lexical peut signaler la
présence d'une erreur si la chaine dépasse une certaine taille.
3. Connaissance des unités lexicales (association de l'unité lexicale à un type parmi les unités légales du
langage). A ce stade, l'analyseur peut engendrer une erreur si l'unité ne correspond à aucun type prédéfinit
par le langage.
4. Remplissage de la table des symboles (unités lexicales : nom, valeur, …). Certaines erreurs comme
une double déclaration d'identificateur ou l'utilisation d'un identificateur sans déclaration peuvent être
détectées.
4. Unités lexicales et lexèmes Techniques de compilation
Chapitre 2: Analyse lexicale 7

• 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

Un analyseur lexical peut être construit en se basant sur :


1. Les diagrammes de transition;
2. Les automates à état finis;
3. Un générateur d'analyseurs lexicaux tel que Lex, Flex, JFlex,...

5.1 Analyseur lexical basé sur le diagramme des transitions

• 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

5.1 Analyseur lexical basé sur le diagramme des transitions

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

• On adopte les notations suivantes:


✓ Un état initial est l'état qui commence la reconnaissance d'une unité lexicale. Il est représenté par un
cercle auquel abouti un arc étiqueté par début.
✓ Un état final est l'état traversé lors de la reconnaissance d'une unité lexicale. Il est représenté par un
cercle avec un contour double.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 10

5.1 Analyseur lexical basé sur le diagramme des transitions

✓ 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

5.1 Analyseur lexical basé sur le diagramme des transitions

Exemple :
Nbreel=Chiffre Chiffre*(.Chiffre Chiffre*)? (E(+|-)?Chiffre Chiffre*)?
Cette forme peut être représentée par le diagramme de transitions suivant :

Chiffre Chiffre Chiffre

Début Chiffre . Chiffre E +,- Chiffre


1 2 3 4 5 6 7

E
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 12

5.1 Analyseur lexical basé sur le diagramme des transitions


Démarche générale d'implémentation d'un analyseur lexical à partir d'un diagramme de transition :
1. Chaque état est représenté par un segment du programme.
2. Les états contenants arcs sortants doivent inclure dans leurs segments de code la lecture d'un caractère et
un test pour sélectionner l'arc à suivre.
3. Chaque arc étiqueté par le caractère lu ou par une classe de caractère contenant le caractère lu, donne lieu à
l'exécution du code de l'état pointé par cet arc.
4. S'il n'y a pas d'arc étiqueté par le caractère lu et si l'état actuel n'est pas un état final alors, le programme doit
signaler un échec et le recherche est initialisée à celle de l'unité lexicale suivante à tester (celle correspondante
au diagramme des transitions suivant). Le diagramme de transition suivant est choisi selon une instruction à
choix multiple.
5. Durant l'analyse, les arcs du diagramme de transition sont suivis pour déterminer à chaque fois le fragment de
code de l'état prochain à exécuter.
5. Approches de construction d'un analyseur lexical Techniques de compilation
Chapitre 2: Analyse lexicale 13

5.2 Analyseur lexical basé sur les automates à états finis

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

5.2 Analyseur lexical basé sur les automates à états finis

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

5.2 Analyseur lexical basé sur les automates à états finis

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

5.3 Analyseur lexical basé sur un générateur d'analyseur lexical

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.

Définition des Générateur d'Analys Analyseur lexical (en


unités lexicale eur lexical (LEX) langage C)

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

5.3 Analyseur lexical basé sur un générateur d'analyseur lexical

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

5.3 Analyseur lexical basé sur un générateur d'analyseur lexical

• 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

Vous aimerez peut-être aussi