Théorie des Langages Épisode 3 L analyseur lexical

Documents pareils
Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Les chaînes de caractères

Cours de Programmation 2

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Algorithmique et Programmation, IMA

Initiation à la Programmation en Logique avec SISCtus Prolog

Initiation à la programmation en Python

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

EXCEL TUTORIEL 2012/2013

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Utilisation d objets : String et ArrayList

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

TP 1. Prise en main du langage Python

Chapitre 2. Eléments pour comprendre un énoncé

Présentation du cours de mathématiques de D.A.E.U. B, remise à niveau

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Bases de programmation. Cours 5. Structurer les données

La question est : dans 450 combien de fois 23. L opération est donc la division. Le diviseur. Le quotient

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e


L import massif introduit plusieurs nouvelles fonctionnalités, selon que l on importe un thésaurus, un ensemble de valeurs contrôlées ou un corpus.

L exclusion mutuelle distribuée

Formula Negator, Outil de négation de formule.

Chapitre 1 Qu est-ce qu une expression régulière?

STAGE IREM 0- Premiers pas en Python

Gestion des données avec R

Représentation d un entier en base b

Ecole Technique «Transformation de données documentaires» Poitiers, mars Atelier 1: Sphinx. import, conversion, export de données

Cours d initiation à la programmation en C++ Johann Cuenin

Modes Opératoires WinTrans Mai 13 ~ 1 ~

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Première étape : créer le fichier de données - extraire les données de PMB et les transférer dans Excel

Compilation. Algorithmes d'analyse syntaxique

GUIDE DU NOUVEL UTILISATEUR

Créer vos données sources avec OpenOffice, adieu Excel

ACCÈS SÉMANTIQUE AUX BASES DE DONNÉES DOCUMENTAIRES

Principe de symétrisation pour la construction d un test adaptatif

Traduction des Langages : Le Compilateur Micro Java

Cégep de Saint Laurent Direction des communications et Direction des ressources technologiques. Projet WebCSL : Guide de rédaction web

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

OCL - Object Constraint Language

V- Manipulations de nombres en binaire

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Mesurer les performances (CPU) sous Linux

UE Programmation Impérative Licence 2ème Année

Priorités de calcul :

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation en Caml pour Débutants

RACCOURCIS CLAVIERS. DEFINITION : Une «combinaison de touches» est un appui simultané sur plusieurs touches.

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Théorie de la Programmation

IV- Comment fonctionne un ordinateur?

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

Chapitre I Notions de base et outils de travail

Continuité et dérivabilité d une fonction

Algorithme. Table des matières

Cours 1 : La compilation

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmation impérative

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Organigramme / Algorigramme Dossier élève 1 SI

Les structures. Chapitre 3

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

LES GENERATEURS DE NOMBRES ALEATOIRES

Compilation (INF 564)

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

EES : Engineering Equation Solver Fiche récapitulative - Marie-Sophie Cabot

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

Rappels sur les suites - Algorithme

Architecture des Systèmes d Information Architecture des Systèmes d Information

Langage SQL : créer et interroger une base

Gestion d identités PSL Exploitation IdP Authentic

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Le langage C. Séance n 4

TP 2 Réseaux. Adresses IP, routage et sous-réseaux

Définitions. Numéro à préciser. (Durée : )

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

a) b)

Introduction à l algorithmique et à la programmation M1102 CM n 3

GUIDE Excel (version débutante) Version 2013

IMPORTATION ARTICLES DANS LA BASE DE DONNEES

Exercices Alternatifs. Une fonction continue mais dérivable nulle part

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Cours d Informatique

Rappels Entrées -Sorties

Les fichiers. Chapitre 4

INF 321 : mémento de la syntaxe de Java

Cours d Algorithmique et de Langage C v 3.0

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Base de données relationnelle et requêtes SQL

PRXSENTATION D UN GESTIONNAIRE DE DONNEES NUMERIQUES HIERARCHISEES DESTINE AU DE- -POUILLEMENT D ENQUETES

L informatique en BCPST

Chapitre 2 Le problème de l unicité des solutions

Transcription:

Introduction Lex 1/ 19 Théorie des Langages Épisode 3 L analyseur lexical Thomas Pietrzak Université Paul Verlaine Metz

Introduction Lex 2/ 19 L analyseur lexical constitue la première phase d un compilateur. Sa tâche principale est de lire les caractères d entrée et de produire comme résultat une suite d unités lexicales que l analyseur syntaxique va utiliser. Cette interaction est couramment implantée en faisant de l analyseur lexical un sous-programme ou une coroutine de l analyseur syntaxique. À la réception d une commande «prochaine unité lexicale» émanant de l analyseur syntaxique, l analyseur lexical lit les caractères d entrée jusqu à ce qu il puisse identifier la prochaine unité lexicale. Programme source Analyseur lexical unité lexicale table des symboles Analyseur syntaxique Obtenir prochaine unité lexicale

Introduction Lex 3/ 19 Modèle En général la même unitée lexicale peut être produite en sortie par plusieurs chaînes d entrée. L ensemble de ces chaînes est décrit par une règle appelée modèle, associé à l unité lexicale en question. On dit que le modèle filtre chaque chaîne de l ensemble. Lexème Un lexème est une suite de caractères du programme source qui concorde avec le modèle d une unité lexicale. Par exemple, dans la déclaration Caml suivante : let pi = 3.1416 ; ; La sous-chaîne pi st un lexème de l unité lexicale «identificateur».

Introduction Lex 4/ 19 Attributs des unités lexicales Quand plus d un modèle reconnaît un lexème, l analyseur lexical doit fournir aux phases suivantes du compilateur des informations additionnelles sur le lexème reconnu. Par exemple le modèle nb (nombre) correspond à la fois aux chaînes 0 et 1, mais il est essentiel pour le générateur de code de savoir quelle chaîne a effectivement été reconnue. L analyseur lexical réunit les informations sur les unités lexicales dans les attributs qui leur sont associés. Les unités lexicales influent sur les décisions d analyse syntaxique. Les attributs influent sur la traduction des unités lexicales. En pratique, une unité lexicale a en général un seul attribut : un pointeur vers l entrée de la table de symboles dans laquelle l information sur l unité lexicale est conservée ; le pointeur devient l attribut de l unité lexicale.

Introduction Lex 5/ 19 Exemple istr si expr alors istr si expr alors istr sinon istr ɛ expr term oprel term term term id nb Les terminaux si, alors, sinon, oprel, id et nb engendrent les ensembles de chaînes données par les définitions régulières suivantes : si si alors alors sinon sinon oprel < <= = <> > >= id lettre(lettre chiffre) nb chiffre + (.chiffre + )?(E(+ )?chiffre+)? lettre [A Za z] chiffre [0 9]

Introduction Lex 6/ 19 Exemple (la suite) Pour ce fragment de langage, l analyseur lexical reconnaîtra les mots clés si, alors et sinon au même titre que les lexèmes dénotés par oprel, id et nb. Pour simplifier l exposé, on suppose que les mots clés sont réservés, c est à dire qu ils ne peuvent pas être utilisés comme identificateurs. On suppose que les lexèmes sont séparés par un espace constitué d une suite non vide de blancs, tabulations et fins de ligne. Notre analyseur lexical délimitera ces espaces en comparant une chaîne avec la définition régulière nb suivante : delim blanc tabulation fin de ligne bl delim + Si l analyseur lexical trouve une correspondance avec bl, il ne retourne pas d unité lexicale à l analyseur syntaxique. Il continue par rechercher l unité lexicale qui suit la suite de blancs et la retourne à l analyseur syntaxique.

Introduction Lex 7/ 19 Exemple (la revanche) Expression Unité lexicale Valeur d attribut régulière bl si si alors alors sinon sinon id id pointeur vers une entrée de la table nb nb pointeur vers une entrée de la table < oprel PPQ <= oprel PPE = oprel EGA <> oprel DIF > oprel PGQ >= oprel PGE Les valeurs d attribut pour les opérateurs de relation sont données par les constantes symboliques PPQ, PPE, EGA, DIF, PGQ et PGE.

Introduction Lex 8/ 19 Schéma Création d un analyseur lexical avec Lex. Programme source Lex lex.l ocamllex.mll lex.yy.c ocamllex.ml Compilateur Lex/ Flex / ocamllex Compilateur C / Ocaml lex.yy.c ocamllex.ml a.out flot d entrée a.out suite d unités lexicales

Introduction Lex 9/ 19 Lex est généralement utilisé de la manière décrite précédemment : On prépare une spécification d analyseur lexical en créant le programme lex.l, ocamllex.mll, etc. dans le langage Lex. On compile lex.l, ocamllex.mll, etc. avec un compilateur comme Lex, Flex ou ocamllex pour produire un programme lex.yy.c ou ocamllex.ml. Le programme lex.yy.c, ocamllex.ml, etc. est une représentation sous forme de tableau d un diagramme de transition construit à partir des expressions régulières de lex.l, ocamllex.mll, etc., accompagné d une fonction standard qui utilise la table pour reconnaître les lexèmes. Les actions associées aux expressions régulières dans lex.l, ocamllex.mll sont des morceaux de code C, Ocaml, etc. et sont recopiées directement dans lex.yy.c, ocamllex.ml, etc. Enfin, lex.yy.c, ocamllex.ml, etc. est soumis au compilateur C, Ocaml, etc. pour produire un programme objet a.out, qui est l analyseur lexical qui transforme un flot d entrée en une suite d unités lexicales.

Introduction Lex 10/ 19 Spécifications en Lex Un programme Lex consiste en trois parties : déclarations %% règles de traduction %% procédures auxiliaires Déclarations La section des déclarations comprend des déclarations de variables, des constantes littérales et des définitions régulières. Constante littérale Une constante littérale est un identificateur qui est déclaré pour représenter une constante.

Introduction Lex 11/ 19 Règles de traduction Les règles de traduction d un programme Lex sont des introduction de la forme : m 1 {action 1 } m 2 {action 2 }... m n {action n } où chaque m i est une expression régulière et chaque action i est un fragment de programme qui décrit quelle action l analyseur lexical devrait réaliser quand un lexème concorde avec le modèle m i. Procédures auxilliaires La troisième section contient toutes les Procédures auxilliaires qui pourraient être utiles dans les actions. On pourrait aussi compiler séparément ces procédures et les relier avec l analyseur lexical.

Introduction Lex 12/ 19 Quand l analyseur lexical est activé par l analyseur syntaxique, il commence à lire le texte d entrée qui lui reste, caractère par caractère, jusqu à ce qu il ait trouvé le plus long préfixe du texte d entrée qui corresponde à l une des expressions régulières m i. Il exécute alors l action action i. Typiquement, l action rend le contrôle à l analyseur syntaxique. Cependant, s il ne le fait pas, l analyseur lexical continue à chercher d autres lexèmes jusqu à ce qu une action rende enfin le contrôle à l analyseur syntaxique. La recherche répétée de lexèmes jusqu à un retour explicite permet à l analyseur lexical de traiter les espaces et les commentaires de manière simple. L analyseur lexical retourne une seule information, l unité lexicale, à l analyseur syntaxique. Pour passer une valeur d attribut donnant des informations sur le lexème, on peut l affecter à une variable globale appelée yylval.

Introduction Lex 13/ 19 %{ /* définitions des constantes littérales PPQ, PPE, EGA, DIF, PGQ, PGE, SI, ALORS, SINON, ID, NB, OPREL %} /* définitions régulières */ delim [ \t\n] bl {delim}+ lettre [A-Za-z] chiffre [0-9] id {lettre}+({lettre} {chiffre})* nombre {chiffre}+(\.{chiffre}+)?(e[+\-]?{chiffre}+)? %% {bl} {/* pas d action et pas de retour */} si {return(si);} alors {return(alors);} sinon {return(sinon);} {id} {yylval = RangerId(); return(id);} {nombre} {yylval = RangerNb(); return(nb);} "<" {yylval = PPQ; return(oprel);} "<= {yylval = PPE; return(oprel);} "=" {yylval = EGA; return(oprel);} "<> {yylval = DIF; return(oprel);} ">" {yylval = PGQ; return(oprel);} ">=" {yylval = PGE; return(oprel);} %% RangerId() { /* Procédure pour ranger dans la table des symboles le lexème dont le premier caractère est pointé par yytext et dont la longueur est yyleng et retourner un pointeur sur son entrée */ } RangerNb() { \begin{block}{} /* procédure similaire pour ranger un lexème qui est un nombre */ }

Introduction Lex 14/ 19 Remarques La section des déclarations contient éventuellement la déclaration de certaines constantes littérales utilises par les règles de traduction. Ces déclarations sont entourées par des parenthèses : %{ et %}. Tout ce qui apparaît entre ces parenthèses est copié directement dans l analyseur lexical lex.yy.c et n est pas considéré comme faisant partie des définitions régulières des règles de traduction. Le même traitement s applique aux procédures auxiliaires de la troisième section, RangerId et RangerNb, qui sont utilisées par les règles de traduction ; ces procédures seront copiées textuellement dans lex.yy.c. La section des déclaration comprend aussi quelques définitions régulières. Chacune de ces définitions consiste en un nom et une expression régulière dénotée par ce nom. Par exemple le premier nom défini est delim, il représente la classe de caractère [ \t\n], donc un des trois caractères blanc, tabulation ou fin de ligne.

Introduction Lex 15/ 19 Remarques (oui, encore) Notez que le mot delim doit etre entouré d accolades en Lex, pour le distinguer du modèle composé des cinq lettres delim. On note aussi l antislash utilisé comme échappement pour laisser un caractère métasymbole de Lex retrouver son sens naturel. En particulier, le point décimal dans la définition d un nombre s exprime par \. car un point par lui même représente la classe de tous les caractères excepté la fin de ligne. Il existe une autre manière de s assurer que les caractères aient leur sens naturel même si ce sont des metasymboles de Lex : les entourer de guillemets anglais : ".

Introduction Lex 16/ 19 Remarques (c est pas fini) Considérons les règles de traduction dans la section qui suit le premier %% La première règle dit que si on reconnaît bl, c est à dire une suite maximale de blancs, tabulations et fins de ligne, on n exécute aucune action. En particulier on ne retourne pas à l analyseur syntaxique. La seconde règle spécifie que si on voit les lettres si, on retourne l unité lexicale SI qui est une constante littérale représentant un certain entier interprété par l analyseur syntaxique comme étant l unité lexicale si. Dans la règle correspondant à id, on voit deux instructions dans l action associée. D abord, la variable yylval se voit affecter la valeur de la fonction RangerId ; la définition de cette fonction se trouve dans la troisième section. yylval est une variable dont la définition apparaît dans le résultat de Lex lex.yy.c et qui est aussi accessible par l analyseur syntaxique. Le but de yylval est de contenir la valeur lexicale retournée, alors que la seconde instruction de l action, return(id), se borne à retourner un code identifiant la classe lexicale.

Introduction Lex 17/ 19 Remarques (c est bientôt bon) Supposons qu on donne à l analyseur lexical résultant du programme précédent une entrée constituée de deux tabulations, des lettres si et d un blanc. Les deux tabulations sont le préfixe initial le plus long reconnu par un modèle, ici le modèle bl. L action associée à bl est de ne rien faire, donc l analyseur lexical déplace le pointeur de début d unité lexicale, yytext, jusqu au s et commence à rechercher une autre unité lexicale. Le lexème suivant à reconnaître est si. Notons que les modèles si et {id} concordent tous les deux avec le lexème et qu aucun modèle ne reconnaît une chaîne plus longue. Étant donné que le modèle pour le mot clé si précède celui des identificateurs dans la liste du programme, le conflit est résolu en faveur du mot clé. En général, cette stratégie de résolution de conflit facilite la réservation des mots clés ; il suffit de le placer avant le modèle définissant les identificateurs.

Introduction Lex 18/ 19 Remarques (courage) Prenons un autre exemple ; supposons que <= soient les deux premiers caractères lus. Bien que le modèle concorde avec le premier caractère, ce n est pas la plus longue concordance d un préfixe du texte d entrée. De cette manière, la stratégie de Lex consistant à choisir le préfixe le plus long reconnu par un modèle facilite la résolution du conflit entre < et <= de la manière attendue : en choisissant <= comme prochaine unité lexicale. Les constructions d expressions régulières permisespar Lex sont données sur la page suivante, dans un ordre décroissant de priorité. Dans cette table c représente un caractère, r une expression régulière et s une chaîne et \".^$[]*+?{} / des symboles d opérateurs.

Introduction Lex 19/ 19 Expression Désigne Exemple c tout caractère c qui n est pas un opérateur a \c caractère littéral c \* "s" chaîne littérale s "**". tout caractère sauf fin de ligne a.*b ^ début de ligne ^abc $ fin de ligne abc$ [s] tout caractère appartenant à s [abc] [^s] tout caractère n appartenant pas à s [^abc] r* zéro ou plusieurs r a* r+ un ou plusieurs r a+ r? zéro ou un r a? r{m,n} entre m et n occurences de r a{2,5} r 1 r 2 r 1 puis r 2 ab r 1 r 2 r 1 ou r 2 a b (r) r (a b) r 1 / r 2 r 1 quand suivi de r 2 abc/123