Correction TD de Traduction no1 Licence d’informatique —2006-2007— Introduction

Correction TD de Traduction no1 Licence d’informatique —2006-2007— Introduction ` a l’analyse lexicale Le but de ce TD est d’´ ecrire des expressions r´ eguli` eres caract´ erisant certains lex` emes, puis d’´ ecrire le programme flex correspondant. x Exercice 1. Expressions r´ eguli` eres ´ Ecrire des expressions r´ eguli` eres pour reconnaˆ ıtre : 1. les identificateurs du C (commencent par une lettre ou un , puis une suite de chiffres, lettres ou ) ; 2. les chaˆ ınes de caract` eres du Pascal (’ ... ’ avec ’’ pour faire une apostrophe) ; 3. les chaˆ ınes de caract` eres du C ; 4. les commentaires du C (/* ... */ et // ...) ; 5. les entiers (d´ ecimal, hexad´ ecimal 0x... et octal 0...) ; 6. les flottants avec exposant. ! 1. (LETTRE+_) (LETTRE+_+CHIFFRE)∗ 2. ’ (’’+NON-APOSTROPHE)∗’ 3. " ((\ CARACTERE)+NON-GUILLEMET)∗" 4. – /* (NON-ETOILE + *+ NI-SLASH-NI-ETOILE∗*∗*/ Dire que l’expression r´ eguli` ere n’est pas la bonne solution et qu’il faut utiliser ` a la place les start-conditions. – // (NON-RETOUR-CHARIOT)∗ 5. – d´ ecimal : 0 + ([1-9] [0-9]∗) – hexad´ ecimal : 0x [0-9A-Fa-f] [0-9A-Fa-f]∗ – octal : 0 [0-7] [0-7]∗ 6. – 23. 23.455 : [0-9] [0-9]∗. [0-9]∗ – .4546 : . [0-9] [0-9]∗ – 2.545e-6 : [0-9] . [0-9]∗e (ε+-++) [0-9] [0-9]∗ ! 1 x Exercice 2. Analyse d’un programme flex Que fait le programme flex suivant ? %% "/*" printf("<SE>"); "*/" printf("<ASE>"); "\\n" printf("<ASN>"); "("|"["|"{" printf("<PO>"); ")"|"]"|"}" printf("<PF>"); "?"+ printf("<?;%d>",yyleng); . ; %% int main() { yylex(); return 0; } ! Ce programme : – remplace les s´ equences /* et */ par <SE> et <ASE> ; – remplace les s´ equences constitu´ ees des caract` eres \ et n par <ASN> ; – remplace toute occurrence d’un des caract` eres (, [ ou { par <PO> ; – remplace toute occurrence d’un des caract` eres ), ] ou } par <PF> ; – remplace toute s´ equence de points d’interrogation par une s´ equence <?;N>, o` u N repr´ esente le nombre de points d’interrogation de la s´ equence lue ; – supprime tous les autres caract` eres, car ils sont lus sans que rien ne soit produit en sortie. ! x Exercice 3. ´ Ecriture d’un programme flex 1. Transposer en flex les expressions r´ eguli` eres du premier exercice. ! Penser ` a rappeler que les espaces ont une signification pr´ ecise en flex et qu’ils ne peuvent pas ˆ etre utilis´ es pour a´ erer la pr´ esentation du code. Pr´ esenter la possibi- lit´ e d’utiliser des variables comme LETTRE, et dire ` a quoi correspondent les variables pr´ ed´ efinies yytext et yyleng. 2 // rappel 1: toujours au moins un espace avant du C //(par exemple, des commentaires) // rappel 2: bien sauver un programme flex avec des // retours chariot style Unix LETTRE [a-zA-Z] CHIFFRE [0-9] %% ({LETTRE}|\_)({LETTRE}|\_|{CHIFFRE})* {printf("ID=$$%s$$\n",yytext);} "’"([^’]|"’’")*"’" {printf("chaine pascal=%s\n",yytext);} \"([^"]|\\.)*\" {printf("chaine C=%s\n",yytext);} "//".* {printf("commentaire C=%s\n",yytext);} 0|([1-9]{CHIFFRE}*) {printf("entier decimal=%s\n",yytext);} 0x([a-fA-F]|{CHIFFRE})+ {printf("entier hexadecimal=%s\n",yytext);} 0[0-7]+ {printf("entier octal=%s\n",yytext);} 0|([1-9]{CHIFFRE}*)"."{CHIFFRE}* {printf("flottant=%s\n",yytext);} "."{CHIFFRE}+ {printf("flottant=%s\n",yytext);} {CHIFFRE}"."{CHIFFRE}*e[-+]?{CHIFFRE}+ {printf("flottant=%s\n",yytext);} . ; %% int main() { yylex(); return 0; } ! 2. Am´ eliorer la lisibilit´ e de la reconnaissance des chaˆ ınes de caract` eres et des com- mentaires en utilisant des start conditions. ! // %x X : X est une start condition %x CHAINEPASCAL %x CHAINEC %x COMMENTAIRE %% <CHAINEPASCAL>"’" {printf("’\n"); BEGIN INITIAL;} <CHAINEPASCAL>"’’"|. ECHO; <CHAINEC>\" {printf("\"\n"); BEGIN INITIAL;} <CHAINEC>\\?. ECHO; 3 <COMMENTAIRE>. ECHO; <COMMENTAIRE>"*/" {printf("*/\n"); BEGIN INITIAL;} ’ {printf("chaine Pascal=’"); BEGIN CHAINEPASCAL;} \" {printf("chaine C=\""); BEGIN CHAINEC;} "/*" {printf("commentaire C=/*"); BEGIN COMMENTAIRE;} . ; %% int main() { yylex(); return 0; } ! Extrait de la page man de la commande flex Les motifs en entr´ ee sont ´ ecrits en utilisant un ensemble ´ etendu d’expressions rationnelles. Ce sont : x correspond au caract` ere ’x’ . n’importe quel caract` ere (octet) sauf le retour ` a la ligne [xyz] une « classe de caract` eres » ; dans ce cas, le motif convient pour un ’x’, un ’y’, ou un ’z’ [abj-oZ] une « classe de caract` eres » contenant un intervalle ; convient pour un ’a’, un ’b’, n’importe quelle lettre allant de ’j’ ` a ’o’, ou un ’Z’ [^A-Z] une « classe de caract` eres ni´ ee », c.-` a-d. tout caract` ere sauf ceux dans la classe. Dans cet exemple, tout caract` ere SAUF une lettre majuscule. [^A-Z\n] tout caract` ere SAUF une lettre majuscule ou un retour ` a la ligne r* z´ ero ou plusieurs r, o` u r est une expression rationnelle quelconque r+ un ou plusieurs r r? z´ ero ou un r (c.-` a-d. un r optionnel) r{2,5} entre deux et cinq r r{2,} deux r ou plus r{4} exactement 4 r {nom} le d´ eveloppement de la d´ efinition de « nom » 4 (voir au dessus) "[xyz]\"foo" la cha^ ıne de caract` eres litt´ erale : [xyz]"foo \X si X est ’a’, ’b’, ’f’, ’n’, ’r’, ’t’ ou ’v’, alors la repr´ esentation C ANSI de \x. Sinon, un ’X’ litt´ eral (utilis´ e pour prot´ eger des op´ erateurs comme ’*’) \0 un caract` ere NUL (de code ASCII 0) \123 le caract` ere de valeur octale 123 \x2a le caract` ere de valeur hexad´ ecimale 2a (r) reconna^ ıt un r ; les parenth` eses sont utilis´ ees pour surcharger la priorit´ e (voir plus bas) rs l’expression rationnelle r suivie de l’expression rationnelle s ; appel´ e « concat´ enation » r|s un r ou un s r/s un r mais seulement s’il est suivi par un s. Le texte reconnu par s est inclus quand on d´ etermine si cette r` egle est la « correspondance la plus longue », mais est ensuite renvoy´ e sur l’entr´ ee avant que l’action ne soit ex´ ecut´ ee. Ainsi, l’action ne voit que le texte auquel correspond r. Ce type de motif est appel´ e « contexte de queue ». (trailing context) (Il y a certaines combinaisons de r/s que flex ne peut d´ etecter correctement ; voyez les notes consacr´ ees aux contextes de queue dangereux dans la section D´ efectuosit´ es/Bogues.) ^r un r, mais uniquement au d´ ebut d’une ligne (c.-` a-d. au d´ ebut de l’analyse, ou juste apr` es qu’un saut de ligne ait ´ et´ e d´ etect´ e). r$ un r, mais seulement ` a la fin d’une ligne (c.-` a-d. juste avant un saut de ligne). ´ Equivalent ` a « r/\n ». Notez que la notion qu’a flex d’un « saut de ligne » est exactement celle dont le compilateur C utilis´ e pour compiler flex interpr` ete ’\n’ ; en particulier, sur certains syst` emes DOS, vous devez soit filtrer vous-m^ eme les \r de l’entr´ ee vous-m^ eme, soit utiliser explicitement r/\r\n pour « r$ ». 5 <s>r un r, mais seulement dans la condition de d´ emarrage s (voyez en dessous pour une discussion sur les conditions de d´ emarrage) <s1,s2,s3>r idem, mais dans une des conditions de d´ emarrage s1, s2 ou s3 <*>r un r dans n’importe quelle condition de d´ emarrage, m^ eme une exclusive. <<EOF>> un end-of-file (fin de fichier) <s1,s2><<EOF>> un end-of-file quand on se trouve dans la condition de d´ emarrage s1 ou s2 Notez qu’` a l’int´ erieur d’une classe de caract` eres, tous les op´ erateurs d’expressions rationnelles perdent leur signification sp´ eciale sauf l’´ echappement (’\’) et les op´ erateurs de classes de caract` eres, « - », « ] » et, au d´ ebut de la classe, « ^ ». Les expressions rationnelles list´ ees plus haut sont group´ ees en fonc- tion de leur priorit´ e, allant de la plus haute au sommet ` a la plus basse en bas. En plus des caract` eres et des intervalles de caract` eres, les classes de caract` eres peuvent ´ egalement contenir des expressions de classes de caract` eres. Ce sont des expressions enferm´ ees dans des d´ elimiteurs [: et :] (qui doivent elles-m^ emes appara^ ıtre entre le ’[’ et le ’]’ de la classe de caract` eres ; d’autres ´ el´ ements peuvent ´ egalement ^ etre pr´ esents dans la classe de caract` eres). Les expressions valides sont : [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] Ces expressions d´ esignent toutes un groupe de caract` eres ´ equivalent ` a la fonction C standard correspondante isXXX. 6 uploads/s3/ td1-pdf.pdf

  • 33
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager