Chapitre2. L'analyse Lexicale
Chapitre2. L'analyse Lexicale
Chapitre2. L'analyse Lexicale
1. Définition
Un analyseur lexical est un programme qui lit les caractères d’entrée d’un
langage source et produit une suite d’unités lexicales. Il réalise aussi certaines
taches secondaires, telles que la suppression des caractères inutiles (blanc, fin de
ligne, commentaires, ets.) et la gestion des numéros de lignes pour pouvoir
associer à chaque erreur la ligne dans laquelle elle convient. L’analyseur lexical
interagit avec l’analyseur syntaxique comme montre la figure 1.
Table des
symboles
Une unité lexicale est une suite de caractères qui a une signification
collective. Exemple : les chaines <=, >=, <, > sont des opérateurs relationnels.
L’unité lexicale OPREL (à titre d’exemple). Les chaines toto, tab, afficher sont des
identificateurs (de variables, de constantes ou de fonction). Les chaines if, else,
for sont des mots clefs. Les symboles ; . , ( ) sont des séparateurs.
Un modèle est une règle associée à une unité lexicale qui décrit l’ensemble
des chaines de programme qui peuvent correspondre à cette unité lexicale.
Un lexème est une suite de caractères du programme source qui concorde
avec le modèle d’une unité lexicale.
Exemples :
- L’unité lexicale IDENT (identificateur) en C a pour modèle : toute suite non
vide de caractères composée de chiffres, lettres ou de symbole "_" et qui ne
commence pas par un chiffre. Des exemples de lexème pour IDENT sont toto,
tab1, afficher_txt.
- L’unité lexicale NOMBRE (entier signé) à pour modèle : toute suite non vide
de chiffres précédée éventuellement d’un seul caractère parmi {+,-}. Des
lexèmes possibles pour cette unité sont : +215, -88, 765.
1. Les mots réservés du langage (if, then, begin pour le langage pascal
par exemple).
2. Les constantes (3, 3.14, true, ’bonjour’,…).
3. Les identificateurs qui peuvent être des noms de variables, de
fonctions, de procédures, ets…
4. Les symboles spéciaux, en tenant compte des possibilités
d’assemblage de caractères tels que <, >, <=, >=, :, :=, +, -, /, *.
5. Les séparateurs tels que le point (.) et le point-virgule (;).
Définitions
1. Un alphabet A est un ensemble fini des symboles. L’alphabet binaire {0,1} et les
codes ASCII sont des exemples d'alphabets
2. Une chaine, est une séquence finie de symboles. Le terme mot est également
utilisé.
3. Un langage régulier L sur un alphabet A est définit récursivement de la manière
suivante :
- {ε} est un langage régulier sur A.
- Si a est une lettre de A, alors {a} est un langage régulier sur A.
Union(𝑳 ∪ 𝑴) :
𝐿 ∪ 𝑀 = {s | s ∈ L ou s ∈ M}
Concaténation (𝑳𝑴):
𝐿 𝑀 = {s | s ∈ L et s ∈ M}
𝐿 = ⋃ 𝐿𝑖
∗
𝑖=0
𝐿 = ⋃ 𝐿𝑖
+
𝑖=1
Exemples :
- Si B = {0,1},
- Si C = {0,1,2,3,4,5,6,7,8,9},
- Si K = {a, … , z, A, … , Z},
𝐾(𝐾 ∪ 𝐶)∗ est l'ensemble des mots commençant par une lettre puis composés
d'un nombre quelconque de lettres et chiffres.
Remarques :
4.1 Définition : un automate à états finis (AEF) est défini par un quintuple (Q, Σ,
δ,𝑞0 , F), ou
4.3 Représentation par une table de transition d’un automate à états finis
Un AEF peut être représenté par une table de transition, dans laquelle :
- Les Lignes représentent les états.
- Les colonnes représentent les symboles.
- Le contenu d’une case donne l’ensemble des états qui peut être atteint
par une transition depuis l’état i sur un des symboles de l’alphabet.
Exemple :
A={Q={𝑞0 , 𝑞1 , 𝑞2 , 𝑞3 }, Σ={a,b}, δ,𝑞0 , F={𝑞3 }}, ou δ={𝑞0 ,a}={𝑞0 , 𝑞1 }, δ={𝑞0 ,b}={𝑞0 },
δ={𝑞1 ,b}={𝑞2 }, δ={𝑞2 ,b}={𝑞3 } (automate non déterministe).
a/b
a b b
𝑞0 𝑞3 𝑞1 𝑞2 𝑞3
a b
→ 𝑞0 {𝑞0 , 𝑞1 } 𝑞0
𝑞1 − 𝑞2
𝑞2 − 𝑞3
𝑞3 − −
Le langage régulier reconnu par cet automate est décrit par l’expression
régulière (a/b)*abb.
A noté que cet automate est non déterministe puisqu’à partir de l’état q 0 et à
la lecture d’un a, deux transitions sont possibles : vers q 0 ou q1 .
Remarque :
5. Mettre une ε-transition de l’état final de AFN(s) vers le nouvel état final
(même chose pour l’état final de l’AFN(r)).
6. L’état final de AFN(s) n’est plus un état final (même chose pour l’état final
de AFN(r)). AFN(s)
début 𝑖𝑠 --- 𝑓𝑠
AFN(r)
début 𝑖𝑟 --- 𝑓𝑟
1. Mettre une ε-transition de l’état final de l’AFN(s) vers son état initial.
Exemple :
- 𝑟2 = 𝑏
- 𝑟3 = 𝑎|𝑏 = 𝑟1 |𝑟2
- 𝑟6 = 𝑎 = 𝑟1
- 𝑟7 = (𝑎|𝑏) ∗ 𝑎 = 𝑟4 ∗ 𝑟6 = 𝑟5 𝑟6
- 𝑟8 = 𝑏 = 𝑟2
-
- 𝑟9 = (𝑎|𝑏) ∗ 𝑎𝑏 = 𝑟7 𝑟8
- 𝑟10 = 𝑏 = 𝑟2
-
-
- 𝑟11 = (𝑎|𝑏) ∗ 𝑎𝑏𝑏 = 𝑟9 𝑟10
Remarque
Les règles de construction de Thompson permettent d’avoir un automate à
états finis qui vérifie les propriétés suivantes :
𝑑1 = 𝑟1
𝑑2 = 𝑟2
…
𝑑𝑛 = 𝑟𝑛
⬚
⬚ 𝑟𝑖 est une expression régulière sur l’alphabet ∑∪ {𝑑1 , 𝑑2 , … , 𝑑𝑛−1 },
Ou chaque
et chaque 𝑑𝑖 est un nom différent. Par exemple : l’unité lexicale IDENT peut être
décrite à l’aide de la définition régulière suivante :
Lettre = A_Z|a_z
Chiffre = 0_9
IDENT = (lettre|_)((lettre|chiffre|_)*)
%{
%}
consonne [b-df-hj-np-xz]
ponctuation [, ; : ? ! \ .]
%%
[aeiouy] nbVoyelles++ ;
{consonne} nbConsonnes++ ;
{ponctuation}nbPonctuation++ ;
.|\n
%%
Int main ( ){
yylex( ) ;