02/02/2019Module Compilation1
Introduction: petite historique sur flex/lex définitions de l’outil flex/lex l’objectif de l’outil flex/lex Versions d’outil flex/lex 02/02/2019Module Compilation2
utilisation de flex: Structure de fichier Quelque variables et directives spéciaux Commands flex/lex et la compilation d’ un fichier flex/lex 02/02/2019Module Compilation3
Conclusion: Résumé sur l’outil flex/lex. 02/02/2019Module Compilation4
Quelque notion importantes pour comprendre la suite: (mécanisme de flex/lex) 02/02/2019Module Compilation5 Analyse lexical Unité lexical Grammaire lexical Lexème
Voici ce schéma qui montre les phases de compilation : 02/02/2019Module Compilation6
7 Code source Code cible Analyseur lexical Analyseur syntaxique Analyseur sémantique Générateur de code intermédiare Optimiser le code Génération le code Gestion de la table de symboles Traitement des erreurs
Module Compilation8 Code source Code cible Analyseur lexical Analyseur syntaxique Analyseur sémantique Générateur de code intermédiare Optimiser le code Génération le code Gestion de la table de symboles Traitement des erreurs Nous s’intéréssons ici de cette phase
l’analyse lexical? Fait partie de la première phase de la chaine de compilation,elle cosiste à convertir une chaine de caractère en un liste de symboles (token en anglais),ces symboles ensuite consomées de l’analyse syntaxique (deuxéme phase de la compilation) Un programme qui réalise une analyse lexical est appelé un analyseur lexical (tokenizer) ce dernier est généralement combiné avec un analyseur syntaxique pour analyser la syntaxe d’un texte. 02/02/2019Module Compilation9
Lexème? Est une suite de caractères dans un programme source qui correspond au motif d’un symbole lexical et qui est analysé par un analyseur lexical comme une instance de ce symbole lexical c-à-d: 02/02/2019Module Compilation10 lexème Symbole lexical Analyseur lexical appartient Analysé un instance
02/02/2019Module Compilation11 Nom (catégorie)Valeur IdentifiantX; couleurs; up; Mots-clésIf while return Ponctuation } ( ; Opération + - = / LittérauxTrue false …. commentaire//en ligne /*en bloc Unité lexical? C’est une couple composée d’un nom(catégorie)et son valeur qui est optionnel;
02/02/2019Module Compilation12 Grammaire lexical? Les langages de programmation déffinissent souvent des règles sous la forme d’un grammaire ce dèrnier déffinissant la syntaxe à adopter ces règles et qui prennent souvent la forme d’expresions régulières et déffinissent les séquences de caractères utilisées pour former des lexème.
L’analyseur lexical lit les caractères de l’entrée un à un afin de séparer les unités lexicales : séparateurs, commentaires, mots clés ; identificateurs, entiers, réels, symboles,... Ces unités correspondent à des expressions régulières. Ainsi, les symboles appartiennent à un ensemble fini de caractères, et les identificateurs correspondent par exemple à une suite finie de lettres. 02/02/2019Module Compilation13 Analyseur lexical?
L’analyse lexicale correspond à la détection de ces unités lexicales. Pour cela, l’ensemble des unités lexicales reconnaissables est donné au générateur d’analyseur lexical(comme l’outil flex) par le biais d’une grammaire composée d’expressions régulières. Cette grammaire distingue donc un nombre fini de classes d’unités lexicales, encore appelées lexèmes (token en anglais). 02/02/2019Module Compilation14
Analyseur lexical? On retient ensuite, pour chaque unité lexicale reconnue, sa valeur et sa classe qui seront utilisées dans la construction de l’arbre de syntaxe. Exemples : le mot-clef "int" (INT) correspond à la chaîne int ; un entier (DIGIT) est donné par : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 un identificateur (ID) est donné par : a,..., z, A,..., Z + 02/02/2019Module Compilation15
Petite historique sur flex/lex Définitions de l’outil flex/lex L’objectif de l’outil flex/lex Version de l’outil flex/lex Introduction 02/02/2019Module Compilation16
Introduction Définition d’outil flex: flex est une version libre de l’analyseur lexical lex.il est généralement associé à l’ analyseur syntaxique GNU Bison. flex est un outil pour générer des analyseurs ; sont des programmes qui reconnaisent des motifs lexicaux dans une texte (on les vue déjà). 02/02/2019Module Compilation17
Introduction Petite historique sur l’outil flex: l’outil flex/lex a été dévloppé en 1975 aux laboratoires Bell. A l’origine un outil de Unix, aujourd'hui aussi pour Windows A l’origine pour C, Aujourd’hui aussi pour Java Coopère généralement avec Yacc (générateur d’analyseur syntaxique) 02/02/2019Module Compilation18
Introduction L’objectif d’outil flex: Le seul objectif qui est très importante est : flex a pour but de programmer des analyseur lexicaux en s’affrenchissant totalement les problèmes de création et de gestion des automates (le cas qui est très compliqué si on la fait manuelement). 02/02/2019Module Compilation19
Introduction Versions d’outil flex: Les version les plus populaires et qui sont disponibles actuellement sont: flex version pour GNU Lex (utilise langage C). jLex version java (légères différences dans la syntaxe). CsLex version dérivé de jLex (utilise C #). 02/02/2019Module Compilation20
Structure de fichier flex/lex Quelque variables et directives spéciaux Commands flex/lex et la compilation d’ un fichier flex/lex Utilisation de flex 02/02/2019Module Compilation21
utilisation de flex Structure de fichier flex/lex: La structure d’un fichier flex/lex peut décomposée sur trois partie comme le schéma suivante montre: %{ Partie1: // déclaration en C %} //déclaration flex/lex % Partie2: //les règles de traduction % Partie3 : //code C additionnel 02/02/2019Module Compilation22
utilisation de flex Structure de fichier flex/lex: Pour le code additionnel, ainsi que pour les méthodes utilisées dans les règles de traductions. nous utilisant le langage C. partie1 (déclaration): Ici nous retrouverons les déclarations, dans notre langage C,entourées par( %{%}) Tout ce que nous écrivons entre ces accolades sera placé dans le fichier « lex.yy.c » Remarque : Nous pouvons utiliser cette première partie du fichier lex pour définir des notations raccourcis pour des expressions régulières que nous utilisons par la suite, entourées par des accolades. 02/02/2019Module Compilation 23
Utilisation de flex Structure de fichier flex/lex: partie2 (production): Contient les règles de traduction de la grammaire, chaque règle était composèe d’un production suivie la plus souvent par l’action sémantique qui correspond. Elles sont de la forme suivante : M 1 {action 1} M 2 {action 2} … M n {action n} 02/02/2019Module Compilation 24 Suite d’instruction en C qui décrivent ce que l’analyseur lexical doit faire lorsqu’il reconnaît un lexème Les expressions régulières de lex
Utilisation de flex Structure de fichier flex/lex: Expressions régulières étendues : méta(spésiaux)-opérateurs : [ ] - + ? * ^ " " \ Exemples : les entiers: [0-9]+ les identificateurs C: [a-zA-Z_] [a-zA-Z0-9_]* les commentaires lignes Java: "/ /".* les chaînes de caractères sans " : \" [^"]*\" 02/02/2019Module Compilation 25
utilisation de flex Structure de fichier flex/lex: partie3 (code en C): Ce sont des fonctions C qui sont utilisées pour l’analyse syntaxique. En général, cette partie contient la fonction main(). Toutefois cette partie peut être vide. Dans ce cas, tout se passe comme si on y avait écrit : main() { yylex() } 02/02/2019Module Compilation 26
Utilisation de flex Quelque variables et directives spéciaux : Directive spéciales de lex : ECHO permet de copie yytext dans la sortie de l’analyseur BEGIN suivi d’un nom, place ou démarrage l’analyseur dans l’état souhaité REJECT force l’analyseur à évaluer ‘’la deuxième meilleur règle’’ YYmore() force l’analyseur à concaténer la valeur actuelle de yytext à la prochaine valeur que prendra yytext Unput(c) remplace le caractère c sur le flux d’entrée. YY-FLUSH-BUFFER vide le tampon interne de l’analyseur. YYterminate() normalement appelée lorsque EOF est rencontré, cette directive arrête l’analyseur et renvoie la valeur 0, si tout le texte avait été traité. 02/02/2019Module Compilation 27
Utilisation de flex Quelque variables et directives spéciaux : - variablles lex : Char*yytext élément lexical courant Int yyleng taille de l’element lexical courant FILE*YYin fichier à partir du quel lex lit FILE*YYout fichier de sortie (dans le quel lex affiche les ECHO) Int YY-START était courant de démarrage de l’analyseur 02/02/2019Module Compilation 28
Utilisation de flex Commands flex/lex et la compilation d’ un fichier flex/lex : Pour les commandes qui nous utilisons sur flex ;sont des commandes pour compiler des « fichier.l » qui sont succissivement : Flex nom fichier.l Cc lex.yy.c -lfl./a.out Lors de la compilation d’un fichier on doit entrer la commande « flex nom_de fichier.l » Nous obtenons ensuite un nouveau fichier lex.yy.c qui comporte le code compiler par lex. Lex inclut à ce moment le fichier y.tab.c qui a été généré par yacc, on trouve dans ce fichier des différentes déclarations qui facilite l’opération de compilation 02/02/2019Module Compilation 29
Utilisation de flex Commands flex/lex et la compilation d’ un fichier flex/lex : flex/ lex génère ensuite un analyseur lexical dans un fichier « lex.yy.c » aui inclut entre autres la fonction « yylex » cette dèrnière lire le texte en entrée standard lettre par lettre et appliquer les règles définies dans la deuxième partie du programme lex. 02/02/2019Module Compilation 30
Conclusion (Résumé) Lex est un outil très populaire qui devient une norme de fait pour la génération d’analyseurs lexicaux. Il prend en entrée les spécifications de utilisateurs sous forme d’expressions régulières et génère(s’il n y a pas d’erreurs) un programme en C contient la table de transition de l’automate d’états finis déterministe minimal et l’algorithme d’analyse lexical. Ce programme en C devra à son tour être compilé avec un compilateur C pour générer l’exécutable de l’analyseur lexical. Lex est un outil très populaire qui devient une norme de fait pour la génération d’analyseurs lexicaux. Il prend en entrée les spécifications de utilisateurs sous forme d’expressions régulières et génère(s’il n y a pas d’erreurs) un programme en C contient la table de transition de l’automate d’états finis déterministe minimal et l’algorithme d’analyse lexical. Ce programme en C devra à son tour être compilé avec un compilateur C pour générer l’exécutable de l’analyseur lexical. 02/02/2019Module Compilation 31
Les références : Références: flex.html#lex_simple_example. bases-de-lex.html /02/2019Module Compilation 32
Entour de flex L’instalation d’outil flex/lex: Sur linux: On distinguedeux méthodes: avec connexion: Sans connexion: on suivie les étapes suivantes: Sur windows: on suivie les étapes suivantes: 02/02/2019Module Compilation33