Click here to load reader

Introduction a la compilation Analyse lexicale - C2

  • View
    268

  • Download
    5

Embed Size (px)

DESCRIPTION

Introduction a la compilation Analyse lexicale - C2

Text of Introduction a la compilation Analyse lexicale - C2

  • 1. Universite Paris-Sud` Introduction a la compilation Sylvain Conchon Cours 2 / 12 septembre 2013

2. Analyse lexicale ` Quandjetaisenfant,onmavaitditquelePereNoeldescendaitpar lacheminee,etquelesordinateursseprogrammaientenbinaire.Jai apprisdepuisquelaprogrammationsefaisaitdepreference dansdeslangagesdehautniveau,plusabstraitsetplusexpressifs.2 3. Analyse lexicale ` Quand jetais enfant, on mavait dit que le Pere Noel descendait par la cheminee, et que les ordinateurs se programmaient en binaire. Jai appris depuis que la programmation se faisait de preference dans des langages de haut niveau, plus abstraits et plus expressifs. ` introduction de la these de X. Leroy3 4. Analyse lexicale lanalyse lexicale est le decoupage du texte source enmots de meme que dans les langues naturelles, ce decoupage en mots facilite le travail de la phase suivante, lanalyse syntaxique ` ces mots sont appeles des lexemes (tokens)4 5. Analyse lexicale : exemple . . .` source = suite de caracteresfun x (* ma fonction *) x+1 analyse lexicaleanalyse syntaxique (semaine prochaine) syntaxe abstraiteFun "x" App` suite de lexemesfun x -> x + 1 . . .App Const Op Var 1 + "x"5 6. Les blancs les blancs (espace, retour chariot, tabulation, etc.) jouent un role dans ` lanalyse lexicale ; ils permettent notamment de separer deux lexemes ` ainsi funx est compris comme un seul lexeme (lidenticateur funx) et ` fun x est compris comme deux lexemes (le mot cle fun et lidenticateur x) de nombreux blancs sont neanmoins inutiles (comme dans x + 1 ) et simplement ignores ` les blancs napparaissent pas dans le ot de lexemes renvoye6 7. Les blancs` les conventions different selon les langages, ` et certains des caracteresblancs peuvent etre signicatifsexemples : les tabulations pour make retours chariot et espaces de debut de ligne en Python ou en Haskell (lindentation determine la structure des blocs)7 8. Les commentaires les commentaires jouent le role de blancsfun(* et hop *)x x + (* jajoute un *) 1 ici le commentaire (* et hop *) joue le role dun blanc signicatif ` (separe deux lexemes) et le commentaire (* jajoute un *) celui dun blanc inutile note : les commentaires sont parfois exploites par certains outils (ocamldoc, javadoc, etc.), qui les traitent alors differemment dans leur propre analyse lexicaleval length : list int (** Return the length (number of elements) of ... 8 9. Quels outils pour realiser lanalyse lexicale, on va utiliser ` ` des expressions regulieres pour decrire les lexemes des automates nis pour les reconnatre ` on exploite notamment la capacite a construire automatiquement un automate ni deterministe reconnaissant le langage decrit par une ` expression reguliere (cf. cours langages formels)9 10. ` Expressions regulieres : syntaxe et semantiquer ::= | | | | | a rr r|r rL() = L( ) = L(a) = L(r1 r2 ) = L(r1 | r2 ) = L(r ) = { } {a} {w1 w2 | w1 L(r1 ) w2 L(r2 )} L(r1 ) L(r2 ) n n+1 = r r n ` 0 n0 L(r ) ou r = , r conventions : letoile a la priorite la plus forte, puis la concatenation, puis enn lalternative10 11. Exemplessur lalphabet {a, b}mots de trois lettres(a|b)(a|b)(a|b) mots se terminant par un a(a|b) a mots alternant a et b(b| )(ab) (a| )11 12. ` Reconnaissance de lexemes` lexemeexpression ` reguliere mot cle funf unsymbole ++symbole ->->automate0f100-u+12n31>212 13. ` Constantes entieres ` constantes entieres decimales, eventuellement precedees de zeros ` expression reguliere(0|1|2|3|4|5|6|7|8|9) (0|1|2|3|4|5|6|7|8|9)automate00..91 0..913 14. Identicateurs identicateurs composes de lettres, de chiffres et du souligne, et commencant par une lettre ` expression reguliere(a|b| . . . |z|A|B| . . . |Z) (a|b| . . . |z|A|B| . . . |Z| |0|1| . . . |9)automate0a..zA..Z1a..zA..Z 0..914 15. Constantes ottantes constantes ottantes de Caml ` expression regulieredd(.d| ( | .d )(e|E) ( | + |)d d )ou d = 0|1| . . . |9 ` automate+,-3 e,E 00..91 0..9.e,E40..90..9250..90..9 15 16. Commentaires les commentaires de la forme (* ... *), mais non imbriques, peuvent ` egalement etre denis de cette maniere ` expression reguliere( **r1 | r2* *)` ou r1 = tous les caracteres sauf * et ) ` ` et r2 = tous les caracteres sauf * automate ni0(1** 23)4r1 r2* 16 17. Commentaires imbriques ` les expressions regulieres ne sont pas assez expressives pour denir les commentaires imbriques (le langage des mots bien parentheses nest pas regulier) ` on expliquera plus loin comment contourner ce probleme17 18. Analyseur lexical un analyseur lexical est un automate ni pour la reunion de toutes les ` ` expressions regulieres denissant les lexemesle fonctionnement de lanalyseur lexical, cependant, est plus complexe que la simple reconnaissance dun mot par un automate, car il faut decomposer un mot (le source) en une suite de mots reconnus il peut y avoir des ambigutes ` il faut construire les lexemes (les etats naux contiennent des actions)18 19. Ambigutes ` le mot funx est reconnu par lexpression reguliere des identicateurs, ` mais contient un prexe reconnu par une autre expression reguliere (fun) ` on fait le choix de reconnatre le lexeme le plus long possible ` le mot fun est reconnu par lexpression reguliere du mot cle fun mais aussi par celle des identicateurs ` on classe les lexemes par ordre de priorite19 20. Analyseur lexical exemple : le mot cle fun et les identicateurs0f1un2=u=n=f3a..z4 a..z20 21. ` Pas de retour en arriere ` avec les trois expressions regulieresa,ab,bc un analyseur lexical va echouer sur lentreeabc (ab est reconnu, comme plus long, puis echec sur c)pourtant le mot abc appartient au langage a|ab|bc21 22. Analyseur lexical lanalyseur lexical doit donc memoriser le dernier etat nal rencontre, le cas echeant lorsquil ny a plus de transition possible, de deux choses lune : aucune position nale na ete memorisee echec de lanalyse lexicale ` on a lu le prexe wv de lentree, avec w le lexeme reconnu par le ` dernier etat nal rencontre on renvoie le lexeme w, et lanalyse redemarre avec v prexe au reste de lentree22 23. Un peu de programmation programmons un analyseur lexical on introduit un type dautomates nis deterministestype automaton = { initial : int; (* tat = entier *) e trans : int Cmap.t array; (* tat -> char -> tat *) e e action : action array; (* tat -> action *) e } avectype action = | NoAction (* pas daction = pas un tat final *) e | Action of string (* nature du lex`me *) e etmodule Cmap = Map.Make(Char)23 24. Un petit analyseur lexical la table de transitions est pleine pour les etats (tableau) et creuse pour les ` caracteres (AVL) on se donnelet transition autom s c = try Cmap.find c autom.trans.(s) with Not found -124 25. Un petit analyseur lexical lobjectif est decrire une fonction analyzer qui prend un automate et une ` ` chane a analyser, et renvoie une fonction de calcul du prochain lexeme soitval analyzer : automaton string (unit string string) ` note : on pourrait egalement renvoyer la liste des lexemes, mais on adopte ici la methodologie qui est utilisee en pratique dans linteraction entre analyse lexicale et analyse syntaxique25 26. Un petit analyseur lexical utilisation :# let next token = analyzer autom "fun funx";; # next token ();; - : string * string = ("keyword", "fun") # next token ();; - : string * string = ("space", " ") # next token ();; - : string * string = ("ident", "funx") 26 27. Un petit analyseur lexical (suite)# next token ();;Exception: Failure "chec". e27 28. Un petit analyseur lexical ` on memorise la position courante dans lentree a laide dune referencecurrent pos let analyzer autom input = let n = String.length input in let current pos = ref 0 in (* position courante *) fun () ... 0inputn ` ...deja analyse... current pos note : lapplication partielle de analyzer est cruciale 28 29. Un petit analyseur lexical let analyzer autom input = let n = String.length input in let current pos = ref 0 in fun () let rec scan last state pos = (* on sappr^te ` examiner le caract`re pos *) e a e ... in scan None autom.initial !current pos0inputn ...` dernier lexeme reconnu current pos last pos 29 30. Un petit analyseur lexical on determine alors si une transition est possiblelet rec scan last state pos = let state = if pos = n then -1 else transition autom state input.[pos] in if state >= 0 then (* une transition vers state *) ... else (* pas de transition possible *) ...30 31. Un petit analyseur lexical ` si oui, on met a jour last, le cas echeant, et on appelle scan recursivement sur stateif state >= 0 then let last = match autom.action.(state) with | NoAction last | Action a Some (pos + 1, a) in scan last state (pos + 1)last a la forme Some (p, a) ou ` ` p est la position qui suit le lexeme reconnu ` a est laction (le type du lexeme) 31 32. Un petit analyseur lexical si au contraire aucune transition nest possible, on examine last pour determiner le resultatelse match last with | None failwith "chec" e | Some (last pos, action) let start = !current pos in current pos := last pos; action, String.sub input start (last pos - start) 0inputn ...` lexeme reconnu current pos last pos pos 32 33. Un petit analyseur lexical testons avec un mot cle : f un des identicateurs : (a..z)(a..z) des blancs : espace espace0f1u =uespacen2 =n=f 5a..z4espace3a..z33 34. Un petit analyseur lexicallet autom = { initial = 0; trans = [| ... |]; action = [| (*0*) NoAction; (*1*) Action "ident"; (*2*) Action "ident"; (*3*) Action "keyword"; (*4*) Action "ident"; (*5*) Action "space"; |] }34 35. Autres possibilites il y a bien sur dautres possibilites pour programmer un analyseur lexical exemple : n fonctions mutuellement recursives, une par etat de lautomatelet rec state0 pos = match input.[pos] with | f state1 (pos + 1) | a..e | g..z state4 (pos + 1) | state5 (pos + 1) failwith "chec" e | and state1 pos = match input.[pos] with | ...35

Search related