Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
4
Chapitre 02 : Analyse lexicale
1. Introduction 2. Dfinitions 3. Expressions rgulires 4. Automates 5. Erreurs Lexicales 6. Mis en uvre d'un analyseur lexical 7. Outil Lex (gnrateur danalyseur Lexical)
1. Introduction L'analyseur lexical constitue la premire tape d'un compilateur. Sa tche principale est de lire les caractres d'entre et de produire comme rsultat une suite d'units lexicales que l'analyseur syntaxique aura traiter.
En plus, l'analyseur lexical ralise certaines tches secondaires comme l'limination de caractres superflus (commentaires, tabulations, fin de lignes, ...), et gre aussi les numros de ligne dans le programme source pour pouvoir associer chaque erreur rencontre par la suite la ligne dans laquelle elle intervient.
Analyseur lexical Table des symboles Analyseur syntaxique U.L U.L suivante Code source Analyse smantique Analyseur Lexicale Ensemble des lexmes Code source Messages derreurs Analyse lexicale Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib 5 2. Dfinitions 1. Une unit lexicale est une suite de caractres qui a une signification collective. 2. Un lexme toute suite de caractre du programme source qui concorde avec le modle d'une unit lexicale. 3. Un modle (Rgle lexicale) est une rgle associe une unit lexicale qui dcrit l'ensemble des chanes du programme qui peuvent correspondre cette unit lexicale. 4. Attributs : informations concernant le lexme (champs dans la table des symboles) ; Exemples - L'unit lexicale IDENT (identificateurs) en C a pour modle : toute suite non vide de caractres compose de chiffres, lettres ou du symbole "_" et qui commencent par une lettre. Des exemples de lexmes pour cette unit lexicale sont : truc, i, a1, ajouter_valeur ... - L'unit lexicale NOMBRE (entier sign) a pour modle : toute suite non vide de chiffres prcde ventuellement d'un seul caractre parmi. Comme par exemple : -12, 83204, +0 ... - L'unit lexicale REEL a pour modle : tout lexme correspondant l'unit lexicale NOMBRE suivi ventuellement d'un point et d'une suite (vide ou non) de chiffres, le tout suivi ventuellement du caractre E ou e et d'un lexme correspondant l'unit lexicale NOMBRE. Cela peut galement tre un point suivi d'une suite de chiffres, et ventuellement du caractre E ou e et d'un lexme correspondant l'unit lexicale NOMBRE. Exemples de lexmes : 12.4, 0.5e3, 10., -4e-1, -.103e+2 3. Erreurs Lexicales Peu d'erreurs sont dtectables au seul niveau Lexical : Plusieurs stratgies sont possibles : - mode panique : on ignore les caractres qui posent problme et on continue. Cette technique se contente de refiler le problme l'analyseur syntaxique - transformations du texte source : insrer un caractre, remplacer, changer, etc. Elle se fait en calculant le nombre minimum de transformations apporter au mot qui pose problme pour en obtenir un qui ne pose plus de problmes. Cette technique de rcupration d'erreur est trs peu utilise en pratique car elle est trop coteuse implanter. 4. Expressions rgulires Une expression rgulire est une notation pour dcrire un langage rgulier. Soit A un alphabet (un ensemble de lettres), une expression rgulire est donc: 1. Les lments de A, c et C sont des expressions rgulires. 2. Si o et | sont des expressions rgulires, alors (o | |), (o|) et o* sont des expressions rgulires. (o | |) reprsente lunion, (o|) la concatnation et o* la rptition (un nombre quelconque de fois). c est llment neutre par rapport la concatnation et C est lensemble vide de caractre, neutre par rapport lunion.
Exemple : (a|b)*abb, Identificateur = alpha (alpha | numer)* En fait, les expressions rgulires sont beaucoup plus puissantes que ce dont on a besoin lorsquon fait de lanalyse lexicale. Analyse lexicale Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib 6 Exemple On dcrit les lexmes par des expressions rgulires. Les mots cls: "for", "if" Les variables: ['a'-'z']+ ['0'-'9']* Les entiers: ['0'-'9']+ Les symboles: '(', ')', '+', '*', '=' Le lexme vide: (' ' | '\n') Lordre de priorit Les oprateurs , concatnation et | sont associatifs gauche, et vrifient 1. 2. concatnation 3. | Dfinitions rgulires La nomination des expressions rgulires est dite une dfinition rgulire. Ces noms seront utiliss pour construire dautres expressions rgulires. On crit donc d 1 r 1
d 2 r 2
. . . d n r n
o chaque d i est un nom distinct et chaque r i est une expression rgulire sur lalphabet U {d 1 ,d 2 ,d i-1 } Exemple Voici quelques dfinitions rgulires, et notamment celles de identificateur et nombre, qui dfinissent les identificateurs et les nombres du langage Pascal : lettre A | B | . . . | Z | a | b | . . . | z chiffre 0 | 1 | . . . | 9 identificateur lettre ( lettre | chiffre ) chiffres chiffre chiffre frac . chiffres | Exp ( E (+ | - | ) chiffres ) | nombre chiffres frac exp Notations abrges Pour allger certaines critures, on complte la dfinition des expressions rgulires en ajoutant les notations suivantes : - Soit x une expression rgulire, dfinissant le langage L(x) ; alors (x) + est une expression rgulire, qui dfinit le langage (L(x)) + , - Soit x une expression rgulire, dfinissant le langage L(x) ; alors (x)? est une expression rgulire, qui dfinit le langage L(x) { }, - Si c 1 , c 2 ,. . c k sont des caractres, lexpressions rgulire c 1 |c 2 |... |c k peut se noter [c 1 c 2 ... c k ], - Lexpression [c 1 c 2 ] dsigne la squence de tous les caractres c tels que c 1 c c 2 . Exemple Les dfinitions de lettre et chiffre donnes ci-dessus peuvent donc se rcrire : lettre [AZaz] chiffre [09] Analyse lexicale Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib 7 5. Automates Un automate tats finis (AEF) est dfini par - un ensemble fini E d'tats - un tat e 0 distingu comme tant l'tat initial - un ensemble fini T d'tats distingus comme tats finaux (ou tats terminaux) - un alphabet des symboles d'entre - une fonction de transition o:A E E qui tout couple form d'un tat et d'un symbole de fait correspondre un ensemble (ventuellement vide) d'tats : o (e i ,a)={ei1,,e in } Les automates sont souvent donns sous la forme d'un graphe: les tats sont les nuds du graphe et les arcs correspondent la fonction de transition. Exemple ={a,b}, E={0,1,2,3}, e 0 =0, T={3} (0,a)={0,1}, (0,b)={0}, (1,b)={2}, (2,b)={3}, Reprsentation graphique :
Construction d'un AFN partir d'une E.R. Pour une expression rgulire s, on note A(s) un automate reconnaissant cette expression.
1. automate acceptant la chane vide
2. automate acceptant la lettre a
3. automate acceptant (r)(s) 1. mettre une -transition de chaque tat terminal de A(r) vers l'tat initial de A(s) 2. les tats terminaux de A(r) ne sont plus terminaux 3. le nouvel tat initial est celui de A(r) 4. (l'ancien tat initial de A(s) n'est plus tat initial)
4. automate reconnaissant r|s 1. crer un nouvel tat initial q 2. mettre une -transition de q vers les tats initiaux de A(r) et A(s) 3. (les tats initiaux de A(r) et A(s) ne sont plus tats initiaux)
5. automate reconnaissant r+
Analyse lexicale Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib 8 6. Mise en uvre d'un analyseur lexical A) A la main Un automate peut trs facilement tre simul par un algorithme. C'est encore plus facile si l'automate est dterministe. Alors, on peut crire un programme reconnaissant tout mot de tout langage rgulier. Ainsi, si l'on veut faire l'analyse lexicale d'un langage rgulier, il suffit d'crire un programme simulant l'automate qui lui est associ. Exemples Start 1 alpha 2 numer 3 4 oparith-{/} < alpha ou numer numer 6 8 > = 5 = 7 = 9 10 = : 11 ; 13 14 / * * 12 / !=* !=/ 15
buffer=&Buffer[0]; while(1) { c = lireChar(); switch(etat){ case: 0 switch(type(c)){ buffer*=c;buffer++; case ALPHA: etat=1;break; case NUMER: etat=2;break; case OPARITH-{/}: etat=3; break; case '<': etat=4; break; case '>': etat=6; break; case '=': etat=8; break; case ':': etat=9; break; case ';': etat=11; break; case '/': etat=12; break; default: erreur;} break; case 1: if (type(c) == ALPHA ou type(c) == NUMER) { buffer*=c;buffer++; etat=1;} else {buffer*='\0'; remettreCar(); return(ajouter_token(Buffer,TYPE_IDENT));} break; Analyse lexicale Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib 9 case 2: if (type(c) == NUMER){ buffer*=c;buffer++; etat=2;} else { buffer*='\0';remettreCar(); return(ajouter_token(Buffer,TYPE_NUMER));} break; case 3: return(ajouter_token(Buffer,TYPE_OPER)); break; {{ finir!!}} } B) Automatiquement Il existe des outils pour crire des programmes simulant des automates partir de simples dfinitions rgulires. Par exemple : flex