Professional Documents
Culture Documents
10
Une expression rgulire Lex se compose de caractres normaux et de mta-caractres, qui ont une signification spciale: $, \, ^, [,], {,}, <, >, +, -, *, /,|,?. Le tableau suivant donne les expressions rgulires reconnues par Lex. Attention, Lex fait la diffrence entre les minuscules et les majuscules. Expression c \c "s " Signification tout caractre c qui nest pas oprateur ou mtacaractre caractre littral c (lorsque c est un mtacaractre) chane de caractres nimporte quel caractre, sauf retour la ligne (\n) lexpression qui suit ce symbole dbute une ligne lexpression qui prcde ce symbole termine une ligne nimporte quel caractre de s nimporte quel caractre qui nest pas dans s 0 ou plusieurs occurrences de r 1 ou plusieurs occurrences de r 0 ou 1 occurrence de r Exemple a \+ \. "bonjour " a.b ^abc abc$ [abc] [^xyz] b* a+ d?
.
^ $ [s] [^s] r* r+ r?
Universit de Biskra
Analyse lexicale r{m} r{m,n} r1r2 r1|r2 r1/r2 (r) <x>r m occurrences de r entre m et n occurrences de r r1 suivie de r2 r1 ou r2 r1 si elle est suivie de r2 r r si Lex se trouve dans ltat x e{3} f{2,4} ab c|d ab/cd (a|b)?c <x>abc
11
Remarque Lorsquon se rfre une expression rgulire en utilisant un identificateur, celui-ci est mis entre accolades. Compilation, 3LMD 2011 -2012 Universit de Biskra Mr. Meadi M.Nadjib
Analyse lexicale c. Conditions de dpart Les conditions de dpart permettent de dfinir plusieurs tats de Lex Exemple %start etat1 etat2 . O etat1, tat2 sont les tats possibles de Lex
12
Universit de Biskra
Analyse lexicale
13
Exemples
Ce premier exemple compte le nombre de voyelles, consonnes et caractres de ponctuations d'un texte entr au clavier. %{ int nbVoyelles, nbConsonnes, nbPonct; %} consonne [b-df-hj-np-tv-xz] ponctuation [,;:?!\.] %% [aeiouy] nbVoyelles++; {consonne} nbConsonnes++; {ponctuation} nbPonct++; .|\n // ne rien faire %% main() {nbVoyelles = nbConsonnes = nbPonct = 0; yylex(); printf("Il y a %d voyelles, %d consonnes et %d ponctuations.\n",nbVoyelles, nbConsonnes, nbPonct); }
Universit de Biskra
Analyse lexicale
14
Exemple
L'exemple suivant insert le numro de ligne chaque ligne dans un fichier. %{ int yylineno; %} %% ^(.*)\n printf("%4d\t%s", ++yylineno, yytext); %% int main(int argc, char *argv[]) { yyin = fopen(argv[1], "r"); yylex(); fclose(yyin); }
Etude de cas
Universit de Biskra