Vous êtes sur la page 1sur 6

Ministre de l’Enseignement supérieur et de la Recherche Scientifique

Université Abderrahmane Mira Bejaia


Faculté des sciences exactes
Département d’informatique

Licence académique 3ème année

Cours compilation
Chapitre 2 : Analyse lexicale

1
Licence 3 Cours compilation Chapitre 2

2. 1. Rôle de l’analyse lexicale


La tâche principale d’un analyseur lexical consiste à lire le programme source caractère
par caractère et à produire en sortie une séquence d’unités lexicales qui sont traitées par
l’analyseur syntaxique.
L’interaction entre l’analyseur lexical et l’analyseur syntaxique peut être schématisée comme
suit :

Demande d’une
Code source Code source unité lexicale Code source
Unité lexicale

Code source

2.2. Principe d’un analyseur lexical


L’analyseur lexical peut être vu comme une fonction qui à chaque fois qu’elle est appelée
par l’analyseur syntaxique, lit le programme source caractère par caractère, jusqu’à ce qu’elle
puisse reconnaitre le plus long préfixe pouvant construire une unité lexicale qu’elle retourne à
l’analyseur syntaxique.
Préfixe => sous mot initial.
La lecture commence par le caractère suivant la dernière unité lexicale reconnue, et se termine
avec la reconnaissance du plus long préfixe de la séquence de caractères restants qui constitue
un symbole du langage.
L’analyseur lexical doit aussi assurer certaines tâches secondaires comme :

 Sauter les blancs, les commentaires.


 Assurer la création et la mise à jour de la table des symboles ;
 Gérer les erreurs ;

2.3. Tockens, modèle et lexème


Certaines sous chaines de caractères d’un programme ont la même structure et une même
fonction syntaxique, on les regroupe en une classe dite Tocken (unité lexicale). Cette classe est
décrite par une règle qui est souvent une expression régulière dite modèle associée au Tocken.

2
Licence 3 Cours compilation Chapitre 2

 On dit qu’un modèle filtre chaque sous-chaine de la classe ;


 Un lexème est une séquence de caractère filtré par le modèle d’un tocken.
Exemple :
begin
i := 1 + j ;
if ( i = 1) then i := 0 ;
end

Tocken (unité lexicale) Lexème Modèle


Mot clé Begin, end, if , then Suite de lettres qui appartient à l’ensemble des
mots clés
(𝐿∗ ∈ {𝑀𝑜𝑡𝑠 𝑐𝑙é})
Identificateur i,j Suite de lettres et de chiffres et qui n’appartient
pas à l’ensemble des mots clés. (𝐿∗ 𝐶 ∗ )∗ ∉
{𝑀𝑜𝑡𝑠 𝑐𝑙é})
Opérateur +, =, := Ensemble d’opérateurs
∈ {+, −,/,∗ , =, ∶=, < ⋯ }

2.4. Réalisation des analyseurs lexicaux :


Il existe trois méthodes
2.4.1. Utilisation d’un introducteur (Lex)
Lex est un utilitaire Unix, il accepte en entrée des spécifications d’unité lexicale sous forme
d’expression régulière, et produite en sortie un programme écrit dans le langage c qui une
compilé, reconnait les unités lexicales, ce programme est l’analyseur lexical.
2.4.2. Construction à la main
À partir du 1er caractère d’une entité (mot, Lexème), on se branche à un algorithme
particulier.
Exemple 1
Écrire un analyseur lexical à la main qui reconnait les mots suivants : {𝒂𝒂𝒃, 𝒂𝒃}

3
Licence 3 Cours compilation Chapitre 2

Algorithme
𝒕𝒄 ∶ 𝒕𝒆𝒓𝒎𝒆 𝒄𝒐𝒖𝒓𝒂𝒏𝒕
𝒕𝒔 ∶ 𝒕𝒆𝒓𝒎𝒆 𝒔𝒖𝒊𝒗𝒂𝒏𝒕
𝒅𝒆𝒃𝒖𝒕
𝒕𝒄 ← 𝟏𝒆𝒓 𝒄𝒂𝒓𝒂𝒄𝒕è𝒓𝒆
𝒔𝒊 (𝒕𝒄 =′ 𝒂′ ) 𝒂𝒍𝒐𝒓𝒔
𝒕𝒄 ← 𝒕𝒔;
𝒔𝒊 (𝒕𝒄 =′ 𝒂′ )𝒂𝒍𝒐𝒓𝒔
𝒕𝒄 ← 𝒕𝒔
𝒔𝒊 (𝒕𝒄 =′ 𝒃′ ) 𝒂𝒍𝒐𝒓𝒔
𝒕𝒄 ← 𝒕𝒔
𝒔𝒊 (𝒕𝒄 =′ #′ ) 𝒂𝒍𝒐𝒓𝒔
𝑪𝒉𝒂𝒊𝒏𝒆 𝒂𝒄𝒄𝒆𝒑𝒕é𝒆
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓
𝒔𝒊𝒏𝒐𝒏 𝒔𝒊 𝒕𝒄 =′ 𝒃′ 𝒂𝒍𝒐𝒓𝒔
𝒕𝒄 ← 𝒕𝒔
𝒔𝒊 (𝒕𝒄 =′ #′ ) 𝒂𝒍𝒐𝒓𝒔
𝑪𝒉𝒂𝒊𝒏𝒆 𝒂𝒄𝒄𝒆𝒑𝒕é𝒆
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓

Exemple 2
Écrire un analyseur lexical à la main, qui reconnait les mots suivants :
{𝒂, 𝒂𝒂, 𝒂𝒂𝒂, … , 𝒂𝒏 }𝒕𝒆𝒍 𝒒𝒖𝒆 𝒏 ≥ 𝟏 (𝒂+ )

Algorithme
𝒕𝒄 ∶ 𝒕𝒆𝒓𝒎𝒆 𝒄𝒐𝒖𝒓𝒂𝒏𝒕
𝒕𝒔 ∶ 𝒕𝒆𝒓𝒎𝒆 𝒔𝒖𝒊𝒗𝒂𝒏𝒕
𝒅𝒆𝒃𝒖𝒕
𝒕𝒄 ← 𝟏𝒆𝒓 𝒄𝒂𝒓𝒂𝒄𝒕è𝒓𝒆
𝒔𝒊 (𝒕𝒄 =′ 𝒂′ ) 𝒂𝒍𝒐𝒓𝒔
𝒕𝒄 ← 𝒕𝒔;
𝒕𝒂𝒏𝒕 𝒒𝒖𝒆 (𝒕𝒄 =′ 𝒂′ ) 𝒇𝒂𝒊𝒓𝒆
𝒕𝒄 ← 𝒕𝒔
𝑭𝒊𝒏 𝒕𝒂𝒏𝒕 𝒒𝒖𝒆
𝒔𝒊 (𝒕𝒄 =′ #′ ) 𝒂𝒍𝒐𝒓𝒔
𝑪𝒉𝒂𝒊𝒏𝒆 𝒂𝒄𝒄𝒆𝒑𝒕é𝒆
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓
𝒔𝒊𝒏𝒐𝒏 𝒆𝒓𝒓𝒆𝒖𝒓

4
Licence 3 Cours compilation Chapitre 2

2.4.3. Analyseur lexical utilisant un automate


Les étapes de réalisation de l’analyseur lexical qui utilise un automate sont comme suit :
a. Représentation de l’automate : on représente l’automate par une matrice de
transition, les lignes représentent les états de l’automate, les colonnes représentent
l’alphabet, et un élément de la matrice correspond à une transition.
b. Représentation des états finaux : La représentation des états finaux se fait dans un
vecteur associer à la matrice.
Exemple : soit le langage suivant : 𝐿1 = {𝑎+ 𝑏}
Représentation de l’automate : L’automate correspond au langage 𝐿1 est comme
suit :

𝒂
𝑺𝟎 𝒂 𝒃 𝑺𝟐
𝑺𝟏

Remarque : L’automate doit être simple et déterministe.


Table (matrice) de transition
𝑎 𝒃
𝑆0 𝑆1 -1
𝑆1 𝑆1 𝑆2
𝑆2 -1 -1

Vecteur des états finaux


𝑽𝒇 = {𝑺𝟐 }

5
Licence 3 Cours compilation Chapitre 2

c. Algorithme d’analyse :
L’algorithme d’analyse est comme suit :
Algorithme
𝒕𝒄 ∶ 𝒕𝒆𝒓𝒎𝒆 𝒄𝒐𝒖𝒓𝒂𝒏𝒕; 𝒕𝒔 ∶ 𝒕𝒆𝒓𝒎𝒆 𝒔𝒖𝒊𝒗𝒂𝒏𝒕
𝑬𝒄 ∶ 𝑬𝒕𝒂𝒕 𝒄𝒐𝒖𝒓𝒂𝒏𝒕, 𝑴 ∶ 𝒎𝒂𝒕𝒓𝒊𝒄𝒆 𝒅𝒆 𝒕𝒓𝒂𝒏𝒔𝒊𝒕𝒊𝒐𝒏; 𝑽 ∶ 𝒗𝒆𝒄𝒕𝒆𝒖𝒓 𝒅𝒆𝒔 é𝒕𝒂𝒕𝒔 𝒇𝒊𝒏𝒂𝒖𝒙
𝒅𝒆𝒃𝒖𝒕
𝒕𝒄 ← 𝟏𝒆𝒓 𝒄𝒂𝒓𝒂𝒄𝒕è𝒓𝒆;
𝑬𝒄 ← 𝑳′ é𝒕𝒂𝒕 𝒊𝒏𝒊𝒕𝒊𝒂𝒍;

𝑻𝒂𝒏𝒕 𝒒𝒖𝒆 (𝒕𝒄 ≠ ′ #′ 𝒆𝒕 𝑴[𝑬𝒄, 𝒕𝒄] ≠ −𝟏 )𝒇𝒂𝒊𝒓𝒆


𝑬𝒄 ← 𝑴[𝑬𝒄, 𝑻𝒄];
𝒕𝒄 ← 𝒕𝒔;
𝑭𝒊𝒏 𝒕𝒂𝒏𝒕 𝒒𝒖𝒆
𝑺𝒊 (𝒕𝒄 =′ #′ 𝒆𝒕 𝑬𝒄 ∈ 𝑽 )𝒂𝒍𝒐𝒓𝒔
𝑪𝒉𝒂𝒊𝒏𝒆 𝒂𝒄𝒄𝒆𝒑𝒕é𝒆
𝒔𝒊𝒏𝒐𝒏
𝒆𝒓𝒓𝒆𝒖𝒓
𝑭𝒊𝒏 𝒔𝒊.

Vous aimerez peut-être aussi