Chapitre II Analyse Lexical.

Slides:



Advertisements
Présentations similaires
Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Structure de base des programmes en C.
Advertisements

GEF 243B Programmation informatique appliquée
Premier programme en C :
La boucle for : init7.c et init71.c
DTD Sylvain Salvati
Groupe IHM Isabelle BONDOUX Cédric CASTAGNE Samy FOUILLEUX
Analyse syntaxique (intro)
C.
Chap 1 Grammaires et dérivations.
INTRODUCTION.
Introduction : Compilation et Traduction
FLSI602 Génie Informatique et Réseaux
8. Les tableaux P. Costamagna – ISEN N1.
Algorithme et programmation
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
Les bases de l’Algorithmique
Principes de programmation (suite)
IFT313 Introduction aux langages formels
Cours de programmation
Structures de données linéaires
Introduction : Compilation et Traduction
Algorithmique et Programmation
Analyse lexicale Généralités Expressions rationnelles Automates finis
Outils de Programmation
Bases de données lexicales
IFT313 Introduction aux langages formels
FICHIERS : Définition : Algorithme général:
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Expressions régulières et hash tables
IFT 6800 Atelier en Technologies d’information
Chapitre 3 Syntaxe et sémantique.
Analyse lexicale et syntaxique
Rappel Modèle analyse-synthèse de la compilation
Les Opérateurs Ils régissent toutes les opérations ou transformations sur les valeurs des variables. Opérateur d'affectation Opérateurs arithmétiques Opérateurs.
IFT Complexité et NP-complétude Chapitre 0 Rappels.
Types de données fondamentaux
L’essentiel du langage C
1 GPA435 Systèmes d’exploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D. Chapitre 8 Filtres UNIX.
Animateur : Med HAIJOUBI
Expressions régulières et hash tables
Paradigmes des Langages de Programmation
9ième Classe (Mardi, 4 novembre) CSI2572. H Nous avons vu comment utiliser les directives #define #ifndef #endif Pour s’assurer de l’inclusion unique.
INTRODUCTION.
Les machines de Turing Lionel Blavy Sébastien Giraud Fabien Tricoire
Argc et argv Utilisation des paramètres de la ligne de commande.
Autres éléments du langage
Un survol du language C.
Copyright © 2005 Yves MARCOUX1 Concepts XML de base Yves MARCOUX EBSI - Université de Montréal.
 Syntaxe du langage PHP
Tutorat en bio-informatique
D.E ZEGOUR Ecole Supérieure d’Informatique. Problèmes de décision Concepts de base Expressions régulières Notation particulière pour exprimer certaines.
Le langage Racket (Lisp)
Sémantique des instructions pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Cours LCS N°4 Présenté par Mr: LALLALI
1 Système d’exploitation Les scripts csh 1 ère Année Année Tienté HSU.
Les transducteurs En anglais transducers.
Introduction au langage C Les entrées-sorties
Mettre en formeExaminerManipuler Les fonctions printf() et sprintf Le traitement de chaîne de caractère La fonction printf() formate le contenu d'une chaîne.
6ième Classe (Mercredi, 17 novembre) CSI2572
1. Spoon Christophe Delagarde, septembre 1998 I.U.T., Université de la Méditerrainée 2.
Chap 1 Grammaires et dérivations.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Introduction à l’utilitaire
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Philippe Gandy - 22 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Philippe Gandy – 10 novembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
ALGORITHME ET PROGRAMMATION RÉVISION Informatique et Sciences du Numérique.
Transcription de la présentation:

Chapitre II Analyse Lexical

Introduction AL consiste à segmenter un texte source en un ensemble de mots qu’on appelle «tokens» ( «lexème»), ce qui signifie unité lexicale, que l’analyseur syntaxique va utiliser , Cette interaction est implantée en faisant de l’analyseur lexical un sous programme 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ées jusqu’à ce qu’il puisse identifier la prochaine unité lexicale. Eliminer les blancs s'ils Existent, ainsi que les commentaires. Coder les différentes entités lexicales. Construire la table de symboles.

Unité lexical Une unité lexicale est une suite de caractères qui a une signification collective. Exemple : Les chaines <=, >=, < et > sont des operateurs relationnels. L'unité lexicale est OPREL (par exemple). Les chaines toto, ind, tab et ajouter sont des identificateurs (de variables, ou de fonctions). Les chaines if, else, while sont des mots clefs. Les symboles ,.;() sont des séparateurs

Motifs et lexème : définition Définition motif : Un motif est une règle associée à une unité lexicale qui décrit l'ensemble des chaines du programme qui peuvent correspondre à cette unité lexicale Définition lexème On appelle lexème toute suite de caractère du programme source qui concorde avec le motif d'une unité lexicale. Pour d'écrire le motif d'une unité lexicale, on utilisera des expressions régulières.

Motifs et lexème : exemple Exemple (les identificateurs) L'unité lexicale IDENT (identificateurs) en C a pour motif : toute suite non vide de caractères composée de chiffres, lettres ou du symbole " " et qui commencent par une lettre. Des lexèmes possibles : truc, i, a1, ajouter valeur, ... Exemple (les entiers signés) L'unité lexicale NOMBRE (entier signé) a pour motif : toute suite non vide de chiffres précédée éventuellement d'un seul caractère parmi. Des lexèmes possibles : -12, 83204, +0, ...

Composition de motifs Pour décrire le motif d'une unité lexicale complexe, on peut avoir besoin de la décomposer en unité plus simples. Le motif est donc obtenu par composition d'autres motifs. Exemple (nombres réels) L'unité lexicale REEL a pour motif : Soit un lexème correspondant à l'unité lexicale NOMBRE suivi éventuellement d'un point et d'une suite (vide ou non) de chiffres, le tout suivi éventuellement du caractère "E" ou "e" et d'un lexème correspondant à l'unité lexicale NOMBRE. Soit un point suivi d'une suite de chiffres, et éventuellement du caractère E ou e et d'un lexème correspondant à l'unité lexicale NOMBRE. Exemples de lexemes : 12.4, 0.5e3, 10., -4e-1, -.103e+2, ...

Definition On appellera alphabet un ensemble fini non vide dont les éléments seront appelés lettres ∑ de symbole. Un mot sur un alphabet ∑ est une suite finie d’éléments de ∑. on appel mot vide la suite non contenant aucun élément et qu’on note ε on note noté ∑* l’ensemble infini contenant tous les mots possible sur ∑ on note ∑+ l’ensemble des mots non vide que l’on peut former sur ∑ : ∑+=∑*-{ ε} On note 𝑚 la longueur du mot m, c'est a dire le nombre de symboles de ∑composant le mot. On note Σ 𝑛 l’ensemble des mots ∑* de longueur n

Exemple

Concaténaton

Langages Définition : On appelle langage sur un alphabet ∑ tout sous-ensemble de ∑*

Opération sur les langages

Langages reguliers

Expression reguliére

Expression reguliéres

Notation

Distibuvité

Exemples

Spécification des unités lexical

Définition réguliére

Langages non regulier

Attribut

recap

Automate d’etat finis Un AEF est un quintuplé A=(E , ∑,δ,e0, F), où -E est un ensemble fini non vide d’états - ∑ est un alphabet d’entrée -e0 est l’état initial - F est l’ensemble des états terminaux ou finaux - δ : fonction de transition défini par : Δ : Ex∑ -> E δ(ei,aj) = ek

Exemple Exemple : ∑={a,b} , E={0,1,2,3} A=(E,∑,δ,0,{3}) δ(0,a) = {0,1} δ(0,b) = {0} δ(1,b) = {2} δ(2,b) = {3} ∑ E a b {0,1} 1 - 2 3

Définitnion AFN Un automate fini non-déterministe est un automate tel que dans un état donné, il peut y avoir plusieurs transitions avec la même lettre. Automate fini déterministe Un AFD est un cas particulier d’AFN dans lequel : • Aucun état n’a de ε-transition • Pour chaque état et chaque symbole d’entrée ail y a au plus un arc étiqueté a qui quitte e Dans la table de transition d’un AFD, une entrée contient un état unique au maximum (les symboles d’entrée sont les caractères du texte source), il est donc très facile de déterminer si une chaîne est acceptée par l’automate vu qu’il n’existe, au plus, qu’un seul chemin entre l’état initial et un état final étiqueté par la chaîne en question.

Détermination d’un AFN : L’idée est de regrouper les états pouvant être atteint en lisant un caractère particulier dans un même état 1 1 {1,2,3} a a a 2 a 3

Algorithme de determination partir de l’état initial rajouter dans la table de transition tous les nouveau état produits par leurs transition δi renommer 2) jusqu’à ce qu’il n’y a plus de nouvelles états tous les états contenant au moins un état terminal devient terminaux renuméroter les états rem : δi est la nouvelle fonction de transition obtenue après la transformation elle est constitué à partir de δ tq : δi({e},a)= { δ(e,a)} δi(p,a)= { δ(e,a)} On construit l’automate determinsite AI = {EI , ∑ , δI,{e0},FI}

Exemple précedent ∑ E a b {0,1} {0,2} {0,3} ∑ E a b {0,1} 1 - 2 3 ∑ E {0,1} {0,2} {0,3} ∑ E a b {0,1} 1 - 2 3 ∑ E a b e0 e1 e2 e3

Exemple générateur lexical LEX

Introduction Lex est un utilitaire d'Unix. Son grand frère fLexest un produit GNU. Lex accepte en entrée des spécifications d'unités Lexicales sous forme de définitions régulièreset produit un programme écrit dans le langage C qui, une fois compilé, reconnaît ces unités Lexicales. Ce programme est donc un analyseur Lexical). > Lex fichier.l donne le fichier Lex.yy.c qu'il faut compiler avec Lex : > gcc Lex.yy.c –l l

Introduction Le fichier de spécifications Lex contient des expressions régulières suivies d'actions (règles de traduction). L'analyseur Lexical obtenu lit le texte d'entrée caractère par caractère jusqu'à ce qu'il trouve le plus long préfixe du texte d'entrée qui corresponde à l'une des expressions régulières. Dans le cas où plusieurs règles sont possibles, c'est lapremière règle rencontrée (de haut en bas) qui l'emporte. Il exécute alors l'action correspondante. Dans le cas où aucune règle ne peut être sélectionnée, l'action par défaut consiste à copier le caractère du fichier d'entrée en sortie.

Programme lex Lex.l Compilateur Lex Lex.yy.c Lex.yy.c Compilateur C Executable Texte d’entrée Analyseur Lexical resultant Flot des unités lexicales

Les expression reguliéres Une expression régulière Lex se compose de caractères normaux et de méta-caractères, qui ont une signification spéciale: $, \, ^, [,], {,}, <, >, +, -,*, /,|,?. Le tableau suivant donne les expressions régulières reconnues par Lex. Attention, Lex fait la différence entre les minuscules et les majuscules.

Structure d’un fichier lex Un fichier de description pour Lex est formé detrois parties, selon le schéma suivant : %{ Déclaration en C des variables, des constants,…etc. %} Déclaration des définitions régulières. %% Expression régulières etactions correspondantes Déclaration des procédures auxiliaires Dans lequel aucune partie n'est obligatoire. Cependant, le séparateur "%%" est utilisé pour séparer entre les déclarations et expression régulières et actions correspondantes (le productions).

a. Partie des déclarations La section Déclarations peut elle même se composer de : a.Bloc littéral Cette partie d'un fichier Lex peut contenir : Commence par %{ et se termine par %}. Où %{et %}doivent être placés en début de ligne. Contient des déclarations et définitions en C. Est copié tel quel dans le fichier Lex.yy.c produit par la commande Lex Les définitions et déclarations qu’il contient sont globales au programme produit par Lex. b.Définitions Associations d’identificateurs à des expressions régulières. . Ces définitions sont de la forme : notion expression régulière

Exemple : Remarque Lorsqu’on se réfère à une expression régulière en utilisant un identificateur, celui-ci est mis entre accolades.

a. Partie des déclarations c. Conditions de départ Les conditions de départ permettent de définir plusieurs états de Lex Exemple %start etat1 etat2 …. Où etat1, état2 … sont les états possibles de Lex

B. Partie des productions Contient deux parties Partie gauche : - spécification des expressions régulières reconnues - pour une chaîne de lettres et de chiffres, les guillemets peuvent être omis - identificateurs d’expressions mis entre accolades Partie droite : - actions exécutées lorsque unités Lexicales reconnues - actions définies avec syntaxe C - si scanner appelé par parser YACC, alors : - les attributs de l’unité Lexicale reconnue doivent être déposés dans yylval - l’unité Lexicale reconnue doit être retournée

Exemple

Remarques En cas de conflit, Lex choisit toujours la règle qui produit le plus long lexème. prog action1 program action2 La deuxième règle sera choisie. Si plusieurs règles donnent des lexèmes de mêmes longueurs, Lex choisit la première. [a-z]+action2 La première règle sera choisie. Si aucune règle ne correspond au flot d'entrée,Lex choisit sa règle par défaut implicite : .|\n {ECHO} recopie le flot d'entrée sur le flot de sortie

C. Section Procédures auxiliaires Section optionnelle qui permet de : - définir toutes les fonctions utilisées dans les actions associées aux expressions reconnues - définir (si nécessaire) le programme principal (main()).

Exemple Ce premier exemple compte le nombre de voyelles, consonnes et caractères de ponctuations d'un texte entré au clavier.

Variables et fonctions prédéfinies char yytext[ ]: tableau de caractères qui contient la chaîne d'entrée qui a été acceptée. int yyleng: longueur de cette chaîne.  int yylex(): fonction qui lance l'analyseur (et appelle yywrap()). yylval: retourne la valeur associé à l'unité lexicale reconnue. ECHO afficher l'unité lexicale reconnue (équivalente à printf("%s",yytext);) FILE *yyout: fichier de sortie. FILE *yyin: fichier d'entrée int yywrap(): fonction toujours appelée en fin de flot d'entrée. Elle nefait rien par défaut, mais l'utilisateur peut la redéfinir dans la section des fonctions auxiliaires. yywrap()retourne 0 si l'analyse doit se poursuivre (sur un autre fichier d'entrée) et 1 sinon.

Variables et fonctions prédéfinies unput(char c): remet le caractère dans le flot d'entrée. int yylineno: numéro de la ligne courante. yymore(): fonction qui concatène la chaîne actuelle yytextavec celle qui a été reconnue avant yyless(): fonction admettant un entier comme argument, yyless(k>0) : - supprime les (yyleng-k)derniers caractères de yytext, dont la longueur devient alors k recule le pointeur de lecture sur le fichier d’entrée de (yyleng- k)positions, les caractères supprimés de yytext seront donc considérés pour la reconnaissance des prochaines unités yyterminate(): fonction qui stoppe l'analyseur .

Exemple L'exemple suivant insert le numéro 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); }