Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
SMI/S5
Compilation
Prof.: M. BENADDY
A.U. 2015-2016
Introduction
Rle de lanalyseur lexicale : lire les caractres
dentre (programme source) et de produire comme
rsultat une suite dunits lexicales appeles
TOKENS que lanalyseur syntaxique va utiliser.
Les TOKENS sont constitus au fur et mesure de
la lecture du texte source, on distingue deux types
dunits lexicales.
Les units propres au langage, les mots cls, les
sparateurs, les oprateurs, ...etc.
Les units personnalises qui sont cres par le
programmeur (les constantes, les identificateurs).
Prof. M. BENADDY Compilation 2
Introduction
o
Chaque di est un nouveau symbole distinct qui n'appartient
pas
Chaque ri est une expression rgulire sur les symboles :
U {d1,d2,...,di-1}
Prof. M. BENADDY Compilation 23
Spcification des units lexicales
Expressionsrgulires:
Dfinitionsrgulires:
Exemple1 : les identificateurs en C sont des mots forms de
lettres, chiffres, et underscore (_). Une dfinition rgulire de
cet ensemble est la suivante :
lettre A|B|...|Z|a|b|...|z| _
chiffre 0|1|...|9
id lettre(lettre|chiffre)*
Nimporte quel ws - -
if if -
then then -
else else -
Nimporte quel id id Pointeurverslatabledessymboles
Nimporte quel number Pointeurverslatabledessymboles
number
< relop LT
<= relop LE
= relop EQ
<> relop NE
> relop GT
Prof. M. BENADDY Compilation 34
>= relop GE
Reconnaissance de units lexicales
Diagrammedetransition:
Une tape pour la construction dun analyseur lexical, est de convertir
les modles en des diagrammes, appels diagrammes de transition.
Un diagramme de transition est une collection dtats, relis par des
arcs. Un les tats dans un diagramme de transition sont dfinis comme
suite :
Ltat de dpart est reprsent par un cercle o apparat une flche
entrante
Les tats dacceptation (lexme reconnue) est reprsents par un
cercle double
*
Si un tat dacceptation admet un recul on lui ajoute une toile (*)
Un tat quelconque est reprsent par un cercle
Un arc est reprsent par une flche quittant un tat vers un autre
avec une tiquette <
UtilisationdeLex:
Un fichier lex.l crit en langage Lex, qui dcrit lanalyseur
lexical gnrer est prsent au compilateur Lex en
entre.
Le compilateur Lex transforme lex.l en un programme
crit en C dans un fichier appel lex.yy.c.
Ce fichier est compil par le compilateur C et produit un
fichier excutable a.out qui est le fichier du compilateur
excutable, il prendra en paramtre un fichier crit dans le
langage source et produira en sortie une squence des
units lexicales.
UtilisationdeLex:
StructuredunprogrammeLex:
Un fichier de description pour Lex est form de trois
parties, spares par des lignes contenant seulement %
%, align gauche, selon le schma suivant :
//Partiesdclarations
%{//(variables,constantes,bibliothquesC,etc.)
%}
//expressionsrgulires,dfinitionsrgulires
%%
//Partieproductions(expressionsrgulires)
%%
//codedeservice(fonctionsutilitaires)
StructuredunprogrammeLex:
La partie dclarations comporte les dclarations des
variables, structures, unions, dclarations rgulires,
dclaration des bibliothques en C
La partie productions, les dclarations prennent la forme
suivante :
m 1 {action } 1 Les m sont des expressions rgulires ou
i
StructuredunprogrammeLex:
La 3me partie contient des fonctions qui peuvent tre
utilises dans les actions de la 2 me partie.
Eventuellement ces fonctions peuvent tre compiles
StructuredunprogrammeLex:
Exemple1: Un programme Lex qui affiche le contenu de
son entre standard vers l'cran.
%%
.|\nECHO;
%%
Exemple2 : un programme Lex qui supprime tout les
espaces et tabultations.
%%
[\t]{/*supprimelesespacesettabulations*/}
bye{exit(0);}
StructuredunprogrammeLex:
Exemple3: Un programme Lex qui reconnat les verbes
en anglais.
On considre la liste des verbes suivants :
is am are were
was be being been
do does did will
would should can could
has have had go
StructuredunprogrammeLex:
Exemple3: Un programme Lex qui reconnat les verbes
en anglais.
will I
%{ would I
/* should I
* programme Lex qui reconnat les verbes en Anglais can I
*/ could I
%} has I
[\t ]+ /* ignorer les espaces et tabulations */ have I
is I had I
am l go {printf(''%s : is a verb\n'',
are I yytext);}
were I [a-zA-Z]+ {printf(''%s:is not a
was I verb\n'', yytext);}
be l .|\n {ECHO ; /* autres choses
beingbeen I ou retour la ligne */
do I %%
does I main()
did I {
Prof. M. BENADDY Compilation yylex() ; 50
}
Le gnrateur danalyseur lexicale Lex/Flex
StructuredunprogrammeLex:
Remarques:
yylex() : la fonction principale du programme crit en
LEX.
yytext : pointeur sur le dbut de la chane analyse
(unit lexicale)
Excution :
Lex : lex verbes.l produit un fichier lex.yy.c
gcc : gcc -o verbes lex.y.c -ll (ll : library lex)
Flex : flex verbes.l produit un fichier lex.yy.c
gcc : gcc -o verbes lex.yy.c -lfl (lfl : library fast lex)
StructuredunprogrammeLex:
Exerciced'application:crire un programme en lex qui
reconnat les identificateurs, mot cls et oprateurs en
PASCAL
Automatesfinisnondterministes(AFN):
Un automate fini non dterministe not AFN, not par
l'expression aut = <,E,D,F,T> avec :
Un ensemble de symboles d'entre, l'alphabet du
langage. On considre que la chane vide , n'est jamais un
membre de .
L'ensemble fini E d'tats.
Une fonction de transition qui donne pour chaque tat et
pour chaque symbole de U{}, l'ensemble des tats
suivants T, sous ensemble de ExxE.
L'ensemble D sous-ensemble de E, des tats de dpart.
L'ensemble des tats F, sous-ensemble de E, l'ensemble
des tats d'acceptation ou tats finaux ou tats terminaux.
Prof. M. BENADDY Compilation 55
Les automates tats finis
Automatesfinisnondterministes(AFN):
Exemple :
= {a,b,c} ; E={1, 2, 3, 4} ; D={1} ; F = {3,4} , T
={(1,a,2), (2,b,3),(1,c,4),(3,c,2)}
Automatesfinisnondterministes(AFN):
Graphed'tats:
Un graphe d'tats ressemble un diagramme de
transition, mais dans le cas des AFN, le mme caractre
peut tiqueter deux transitions ou plus en sortie d'un
mme tat et les arcs peuvent tre tiquets par le mme
symbole spciale .
Tous les tats de dpart sont reprsents par un cercle o
apparat une flche entrante :
Les tats terminaux sont reprsents par un cercle double
S'il existe un arc tiquet par un a entre l'tat i et l'tat j,
si le triplet (i, a, j) T on dessine cet arc comme suite :
Prof. M. BENADDY Compilation 57
Les automates tats finis
Automatesfinisnondterministes(AFN):
Graphed'tats:
Exemple:soit le langage (a|b)*abb ; ={a,b} ;
E={0,1,2,3} ; D={0} ; F={3} ; T={(0,a,0),(0,b,0),(0,a,1),
(1,b,2),(3,b,3)}
Automatesfinisnondterministes(AFN):
Graphed'tats:
Notation:
est quivalent
Tabledetransition:
Une autre mthode de reprsentation d'un automate est la
table de transitions, pour dcrire la fonction de transition T
on utilisera une table M indice par E et , tel que si e
E, a , e' M(e,a) ssi (e, a, e') T
Exemple: table de transition correspondante
l'expression rgulire (a|b)*abb
tat a b
0 {0,1} {0} -
1 - {2} -
2 - {3} -
3 - - -
Prof. M. BENADDY Compilation 60
Les automates tats finis
Acceptationd'unechaneparunautomate:
Un AFN accepte une chane d'entre x ssi il existe un chemin dans le
graphe de transition entre l'tat de dpart et un tat d'acceptation
(final), tel que les tiquettes des arcs le long de ce chemin pellent
(enlever le poile) la chane x.
Exemples: La chane aabb est accepte par l'automate de
l'exemple (slide 58) , en se dplaant via les tats (0,0,1,2,3).
Soit l'automate suivant qui accepte les mots du langage engendrs par
l'expression rgulire aa*|bb*
La chane aaa est accepte en se dplaant via les tats (0,1,2,2,2).
les tiquettes de ces arcs sont aaa = aaa.
Acceptationd'unechaneparunautomate:
Exemples(suite):soit l'expression rgulire a abb et la
+
Automatesfinisdterministes:
Un automate fini dterministe (AFD) est un cas particulier d'un automate fini non
dterministe (AFN) dans lequel :
Aucun tat n'a une -transition (une transition sur l'entre ).
Pour chaque tat e et chaque symbole a, il existe un et un seul arc tiquet a
qui quitte e.
Un AFD a au plus une transition partir de chaque tat sur n'importe quel
symbole, en consquence il est trs facile de dterminer si un AFD accepte une
chane d'entre, tant donn qu'il existe au plus un chemin depuis l'tat de dpart
tiquet par cette chane.
Si on utilise une table de transition pour reprsenter un AFD, chaque entre est un
tat singleton.
Un AFN est une reprsentation abstraite d'un algorithme de reconnaissance des
chanes d'un langage.
Un AFD est un algorithme concret de reconnaissance de chanes.
N'importe quel AFN ou expression rgulire peuvent tre transformes en un AFD.
Prof. M. BENADDY Compilation 63
Les automates tats finis
Simulationd'unAFD:
Soit x une chane d'entre qui se termine par un caractre de fin
de fichier (fdf ou eof), soit e un tat de dpart et F l'ensemble des
0
tats terminaux.
Soit la fonction transiter(e,c) qui donne l'tat vers lequel il y a une
transition depuis l'tat e sur le caractre d'entre c, la fonction
carsuiv(x) retourne le prochain caractre de la chane d'entre x.
La simulation d'un AFD est donne par l'algorithme suivant :
e=e0
c=carsuiv(x)
tantque(c!=fdf){
e=transiter(e,c)
c=carsuiv(x)
}
si(eF)alorsretrouner''oui''
sinonretourner''non''
Prof. M. BENADDY Compilation 64
Les automates tats finis
Simulationd'unAFD:
Exerciced'application:
dessiner l'AFD correspondant au langage L((a|b)*abb),
cette automate accepte-t-il la chane x=ababb.
Simulationd'unAFD:
Exercice d'application : dessiner l'AFD correspondant
au langage L((a|b)*abb), cette automate accepte-t-il la
chane x=ababb.
Solution: l'automate correspondant au langage L((a|
b)*abb)) est :
Transformationd'unAFNenunAFD:
Soit les automates suivants :
Aut1
Aut2 :
Transformationd'unAFNenunAFD:
L'automate 1 a deux transitions de l'tat 1 sur la chane
d'entre a qui signifie qu'on peut aller vers l'tat 0 ou 1.
De mme l'automate 2 a deux transitions sur partir de
l'tat 0.
Dans le cas o la fonction de transition est multivalue, il est
difficile de simuler un AFN l'aide d'un programme.
L'acceptation d'une chane d'entre suppose qu'il puisse
exister un chemin tiquet par cette chane qui mne depuis
l'tat de dpart jusqu' un tat d'acceptation.
Mais il existe dans un AFN plusieurs chemins qui pellent la
mme chane d'entre, on doit les prendre en considration
avant de dcider d'accepter ou non la chane d'entre.
Prof. M. BENADDY Compilation 68
Automates tats finis aux expressions rgulires
Transformationd'unAFNenunAFD:
L'ide gnrale de la transformation d'un AFN en un AFD est
qu'un tat de l'AFD correspond un ensemble d'tats de
l'AFN.
L'AFD utilise un tat pour garder trace de tout les tats
possibles que l'AFN peut atteindre aprs avoir lu chaque
symbole d'entre.
Transformationd'unAFNenunAFD:
Algorithme :
Donne : un AFN
Rsultat : un AFD qui accepte le mme langage de l'AFN.
Mthode : l'algorithme construit une table de transition
Dtrans pour l'AFD.
Chaque tat de l'AFD est un ensemble d'tats de l'AFN.
On construit Dtrans de telle manire que l'AFD simulera
tous les dplacements possible que l'AFN peut effectuer
sur une chane d'entre donne.
Transformationd'unAFNenunAFD:
Algorithme :
Pour garder trace des ensemble des tats de l'AFN on
utilisera les oprations suivantes :
Soit e et T tels que e reprsente un tat de l'AFN et T
reprsente un ensemble d'tats de l'AFN.
Opration Description
-fermeture(e) Ensemble des tats de l'AFN accessibles depuis l'tat e
Not aussi -f(e) de l'AFN par des -transition uniquement.
-fermeture(T) Ensemble des tats de l'AFN accessibles depuis un tat
Not aussi -f(T) e T par des -transition uniquement.
transiter(T,a) Ensemble des tats de l'AFN vers lesquels il existe une
Not aussi tran(T,a) transition sur a
Prof. M. BENADDY Compilation 71
Automates tats finis aux expressions rgulires
Transformationd'unAFNenunAFD:
Exemple d'application : soit l'AFN suivant qui accepte le
langage (a|b)*abb
Transformationd'unAFNenunAFD:
Exemple d'application :
L'tat de dpart de l'AFD A=-f(0)={0,1,2,3,4}
L'alphabet = {a, b}
B=-f(tran(A,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(A,a)=B.
C=-f(tran(A,b))=-f({5})={1,2,4,5,6,7} => Dtrans(A,b)=C.
-f(tran(B,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(B,a)=B.
-f(tran(B,b))=-f({5,9})={1,2,4,5,6,7,9} => Dtrans(B,b)=D.
-f(tran(C,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(C,a)=B.
-f(tran(C,b))=-f({5})={1,2,4,5,6,7} => Dtrans(C,b)=C.
-f(tran(D,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(D,a)=B.
-f(tran(D,b))=-f({5,10})={1,2,4,5,6,7,10} => Dtrans(D,b)=E.
-f(tran(E,a))=-f({3,8})={3,1,2,4,6,7,8} => Dtrans(E,a)=B.
-f(tran(E,b))=-f({5})={1,2,4,5,6,7} => Dtrans(E,b)=C.
Prof. M. BENADDY Compilation 73
Automates tats finis aux expressions rgulires
Transformationd'unAFNenunAFD:
Exemple d'application :
L'tat E est l'tat de fin de l'AFD car E contient l'tat 10 qui
est l'tat d'acceptation de l'AFN.
Rgle: un tat de l'AFD est un tat d'acceptation si c'est un
ensemble d'tats de l'AFN qui contient au moins un tat
d'acceptation de l'AFN.
L'AFD quivalent l'AFN est :
Transformationd'unAFNenunAFD:
Exemple d'application :
Table de transition de l'AFD :
tats de l'AFN tats de a b
l'AFD
{0,1,2,4,7} A B C
{1,2,3,4,6,7,8} B B D
{1,2,4,5,6,7} C B C
{1,2,4,5,6,7,9} D B E
{1,2,3,5,6,7,10} E B C