Vous êtes sur la page 1sur 36

Cours : Compilation

Chapitre2 : Analyse lexicale


1
Enseignante : Fehima Achour
fehima.achour@gmail.com
L’analyse lexicale
Objectifs de ce module
En suivant ce chapitre vous allez:
 Comprendre l'analyse lexicale. Être
capable de créer un petit interpréteur.
 Apprendre à réaliser des automates.
Une représentation des enchaînements.
 Découvrir LEX. Et savoir l'interfacer
avec un autre compilateur.
3 Plan Du Cours
I. Introduction

II. Les expressions régulières

III. Les automates

IV. Les analyses

V. LEX : outil de compilation


4 Plan Du Cours
I. Introduction

II. Les expressions régulières

III. Les automates

IV. Les analyses

V. LEX : outil de compilation


5 I. Introduction

Présentation de l’analyseur lexical

Les terminaux

Les séparateurs

L’analyseur lexical vs syntaxique


6 I. Introduction
Présentation de l’analyseur lexical
 La première phase d’un compilateur est : L’Analyse lexicale : Elle consiste à lire les
caractères du programme source afin de les regrouper en terminaux (unités
lexicales), en ignorant les séparateurs.

 Le résultat de cette analyse est un flot de terminaux (une suite d’unités lexicales)
qui sera ensuite transmis à l’analyseur syntaxique.

 L ’analyseur lexical gère les numéros de ligne dans le programme source


pour pouvoir associer à chaque erreur rencontrée par la suite la ligne dans
laquelle elle intervient.

 L ’analyseur lexical élimine les blancs et les commentaires.


7 I. Introduction
Les terminaux
Les terminaux sont les symboles de base (ensemble de caractères) produits par
l’analyse lexicale. Dans nos programmes, nous les retrouvons sous la forme :

 Variables : nombre_de_clients, nom_prenom


 Numériques et constantes : 1,2,3,….
 Opérateurs : +, -, *, MOD, DIV,…
 Marqueurs du langage : ; , != , {, }, (, ),…
 Chaînes de caractères :«salut les copains»
 Identificateurs (IDF, mots-clés du langage) : if, while, break, return, …
8 I. Introduction
Les terminaux
Bien que les variables et les identificateurs représentent des chaînes de caractères,
nous faisons en compilation une différence.

 Variables : désigne un emplacement particulier en mémoire. Ceci s’explique que


nous pouvons retrouver plusieurs fois des variables de noms identiques, mais dans
des fonctions ou des procédures différentes.

 Chaînes de caractères : sont représentées sous un contexte particulier entre les "".

 Identificateurs (IDF): sont dans les langages des noms réservés ne pouvant pas
être réutilisés en variables (sauf dans certain langage exemple de Fortran). Tous les
IDF sont des noms, mais tous les noms ne sont pas des IDF.
9 I. Introduction
Les terminaux : Exemple
Exemple de terminaux contenus dans l’instruction (en Langage C)
suivante :

printf(« la valeur est %d », var);

Les terminaux sont :


 Variables : var
 Marqueurs du langage : ( ) , ;
 Chaînes de caractères : "la valeur est"
 Identificateurs : printf %d
10 I. Introduction
Les terminaux : Exemple
11 I. Introduction
Les séparateurs

Les séparateurs sont en général :

 Des espaces

 Des tabulations : ‘\t’

 Des fins de ligne : ‘\r’ , ‘\n’

 Des commentaires : // , /* */,


12 I. Introduction
L’analyseur lexical vs syntaxique
Programme source

Analyseur lexical
table des symboles
Analyseur syntaxique

 La plupart du temps, c’est l’analyseur syntaxique (présenté dans le Module 3) qui sollicite
les terminaux produits par l’analyseur lexical par un simple appel .

 C’est en réponse à cet appel que l’analyseur lexical lit les caractères en entrée (programme
source) pour reconnaître un terminal qu’il retourne à l’analyseur syntaxique.

Pendant toute la phase de transfert, la table des symboles est complétée.


13 I. Introduction
L’analyseur lexical vs syntaxique

 Avec l’analyseur syntaxique, l’analyseur lexical a une relation du


type producteur-consommateur.

 L’analyseur syntaxique appelle la procédure (coroutine) de


l’analyseur lexical lorsqu’il a besoin du terminal suivant.

 Une première passe d’analyse lexicale produit une séquence de


terminaux, soit en mémoire vive, soit en fichier.

 L’analyse lexicale et l’analyse syntaxique se synchronisent lorsque


le compilateur a besoin d’un terminal.
14 Plan Du Cours
I. Introduction

II. Les expressions régulières

III. Les automates

IV. Les analyses

V. LEX : outil de compilation


15 II. Expressions régulières

Définition

Exemples

Exercices
16 II. Expressions régulières
Définition
Supposons que nous voulons construire tous les IDF valides d’un
langage à partir d’un alphabet  donné ?

Ce processus utilise la notation : Expression Régulière (ER) appelée


ainsi car elle correspond à des règles de constructions (méthodes par
applications).

Une ER : est un motif permettant de décrire des chaînes de caractères


ou des portions complètes de texte.

Une ER : décrit tous les langages qui peuvent être construits par
l’application des opérations sur les symboles du vocabulaire donné.
17 II. Expressions régulières
Définition
L’utilisation des ER peut comprendre

1. La recherche d’éléments dans un texte (ou un flux de données) : il s’agit de


reconnaître des éléments particuliers.

2. L’extraction d’information : il s’agit d’isoler des parties d’une chaîne de


caractères.

3. La validation de données : il s’agit de vérifier la validité d’une information.

4. La substitution et le reformatage : il s’agit de reconnaître un texte pour le


réécrire en un autre.
18 II. Expressions régulières
Définition
Exemple d’une ER de validation des variables en C :
Soit L un ensemble fini de lettres, S un ensemble de séparateurs (ensemble valide du
langage) et C l’ensemble fini des entiers de 0 à 9. Alors l’expression régulière des
variables valides en langage C vérifie qu’une variable commence par une lettre puis peut
comporter des lettres, des séparateurs ou des chiffres :
L(L+S+C)*
• Une ER se lit de gauche à droite comme une suite d’instructions.
• Le + représente la sélection, peut se noté |,ou…
• Les (, ) représentent les groupements des sous-expressions.
• Le * signifie 0 ou plusieurs occurrences de la sous-expression.
• La juxtaposition des symboles du vocabulaire, ici la juxtaposition de L et () représente
leur concaténation.
19 II. Expressions régulières
Définition
Exemple de construction (mot d’un langage) :

1. L’ER a+b dénote le langage {a,b} pour un alphabet  constitué des


caractères a et b.
2. L’ER (a+b)(a+b) dénote le langage {aa, ab, ba, bb}, soit le langage
de toutes les chaînes de longueur 2 sur l’alphabet .
3. L’ER a* dénote le langage des chaînes de 0,1 ou plusieurs a, soit
{,a,aa,aaa,…}.
Remarque : IL est à noter que  représente l’élément vide.
20 II. Expressions régulières
Définition

Exercices :
Sur l’alphabet  constitué des lettres a et b, quels sont
les langages représentés par les ER suivantes :
1. (a+b)*
2. b*
3. a+(ab)*
21 Plan Du Cours
I. Introduction

II. Les expressions régulières

III. Les automates

IV. Les analyses

V. LEX : outil de compilation


22 III. Les automates

Les automates à états finis

Premier exemple: le tourniquet de métro

Application au langage

Automates lexicaux

Expressions régulières vs automates


23 III. Les automates
Les automates à états finis
 Un automate à états finis : est en substance un graphe avec un ou
plusieurs états reconnaisseurs.

 Les automates à états finis sont des reconnaisseurs qui disent « oui »
ou « non » à propos de chaque chaîne d’entrée possible.

 Un automate est constitué d’un ensemble fini S d’états, d’un alphabet


 de symboles d’entrée et d’une fonction de transition qui pour chaque
symbole de  permet d’atteindre un état  S.
24 III. Les automates
Premier exemple : le tourniquet de métro
Deux états :
 Bloqué (état de départ)
 Passant
Bloqué
Deux transitions :
 ticket: l’introduction d’un ticket fait
passer de l’état bloqué à l’état passant ticket passage
 passage: la détection du passage fait
passer de l’état passant à l’état bloqué
Passant
25 III. Les automates
Premier exemple : le tourniquet de métro
Refus
A l’automate précédent nous ajoutons
Un troisième état :
ticket
Retrait
 refus non
valide
Deux transitions :
 ticket non valide : fait passer de l’état Bloqué
bloqué à l’état refus
 retrait : fait passer de l’état refus à ticket passage
l’état bloqué.

Passant
26 III. Les automates
Application au langage
Les langages engendrés par les expressions régulières et les
grammaires peuvent être analysés par un automate à états
finis.
Un tel automate peut se trouver dans différents états en
nombre fini.
Il change d’état selon les caractères qu’il trouve lors de la lecture
du code source à analyser.
Le changement d’état d’un automate s’appelle une transition.

Remarque : Un automate à états finis se trouve initialement


dans un état neutre.
27 III. Les automates
Application au langage
Caractères autorisés : Suite illimitée de “ba”, ER = ba(ba)*
b a

b a b a

Deux automates peuvent générer le langage ba(ba)*. Les états n’ont


pas de nom car ils n’ont pas d’intérêt en eux-mêmes.
Le nombre de séquence que l’automate accepte ou génère est infini,
du fait de la présence d’une boucle (comme le tourniquet).
L’état reconnaisseur peut contenir un ou plusieurs arcs sortant. L’état
reconnaisseur indique que l’automate peut s’arrêter, mais pas
nécessairement qu’il doit s’arrêter.
28 III. Les automates
Application au langage
a
 Ici à partir du point central, deux
transitions portent l’étiquette «a»: l’automate b a
est dit non-déterministe (dit NDFA, Non
Deterministic finite State automaton).
Certains nœuds peuvent avoir plusieurs arcs
sortant portant les mêmes caractères.
b
 Ici l’automate est dit déterministe (dit b a
DFA, Deterministic finite state
automaton). Tous les arcs partant d’un
même nœud correspondent à des caractères
différents
29 III. Les automates
Les automates à états finis
L’exemple des deux automates «ba(ba)*» précédents illustre le
fait que nous pouvons convertir un automate non-déterministe
en automate déterministe, engendrant le même langage. Cette
transformation ne sera pas abordée dans ce module.

Remarque : il y a une difficulté pour un automate non-


déterministe lorsqu’il s’agit de reconnaître une séquence, car il
peut prendre une direction bloquante là où il y a une solution. Il
faut alors une procédure d’aller-retour (back tracking). Il sera
préférable de faire des automates déterministes pour éviter ces
ambiguïtés et ces retours.
30 III. Les automates
Les automates lexicaux
Passons des séquences de lettres aux séquences de mots : Nous
voulons décrire un automate lexical générant les phrases
suivantes :
le chien aboie
le chat aboie
le chien miaule
les chiens aboient
les chats aboient

Exercice :
Donnez l’automate permettant d’engendrer cette grammaire.
III. Les automates
Les automates lexicaux
chat
miaule
Le
chien
aboie

chats miaulent
Les

aboient
chiens
III. Les automates
Les automates lexicaux
1. Cet automate ne permet pas les phrases «agrammaticales »
suivantes :
 le chien aboient
 chien chat miaulent
 (etc.)

2. Cet automate est de type déterministe, à états finis


3. Cet automate engendre exactement les phrases données.
III. Les automates
Les automates lexicaux
1. L’automate suivant veut illustrer les notions de
 boucle
 circuit

2. Il permet maintenant les phrases suivantes :


 le chien est méchant
 le chien est très méchant
 le loup qui mange le chien qui mange le chat est très très méchant
(etc)

Exercice :
Donnez l’automate permettant d’engendrer cette grammaire.
III. Les automates
Les automates lexicaux
chat

loup
le
est
chien
méchant
qui

mange très
35 III. Les automates
Les automates lexicaux
III. Les automates
Exercices
Reprendre les exercices des expressions:
Sur l’alphabet  constitué des lettres a et b, quels
sont les langages représentés par les ER suivantes :

1. (a+b)*
2. b*
3. a+(ab)*

Et construisez les automates correspondant.

Vous aimerez peut-être aussi