Analyse lexicale 2014-2015



Documents pareils
Corrigé des exercices sur les références

Programmer en JAVA. par Tama

Premiers Pas en Programmation Objet : les Classes et les Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Chapitre 10. Les interfaces Comparable et Comparator 1

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Plan du cours. Historique du langage Nouveautés de Java 7

Utilisation d objets : String et ArrayList

TD3: tableaux avancées, première classe et chaînes

Corrigés des premiers exercices sur les classes

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Auto-évaluation Programmation en Java

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

Tp 1 correction. Structures de données (IF2)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Java Licence Professionnelle CISII,

as Architecture des Systèmes d Information

Un ordonnanceur stupide

Une introduction à Java

PROGRAMMATION PAR OBJETS

Programme Compte bancaire (code)

TP1 : Initiation à Java et Eclipse

Programmation en Java IUT GEII (MC-II1) 1

Présentation du langage et premières fonctions

Gestion distribuée (par sockets) de banque en Java

Programmation avec des objets : Cours 7. Menu du jour

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP, première séquence d exercices.

Java Licence Professionnelle CISII,

Programmation Orientée Objet Java

Programmation par les Objets en Java

Solutions du chapitre 4

Remote Method Invocation Les classes implémentant Serializable

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre I Notions de base et outils de travail


Introduction au langage Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

INF 321 : mémento de la syntaxe de Java

Généralités sur le Langage Java et éléments syntaxiques.

ACTIVITÉ DE PROGRAMMATION

Environnements de développement (intégrés)

Introduction : les processus. Introduction : les threads. Plan

Flux de données Lecture/Ecriture Fichiers

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

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

Projet de programmation (IK3) : TP n 1 Correction

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Programmation Web. Madalina Croitoru IUT Montpellier

Cours 1: Java et les objets

STAGE IREM 0- Premiers pas en Python

Définition des Webservices Ordre de paiement par . Version 1.0

Langage Java. Classe de première SI

TD/TP PAC - Programmation n 3

Introduction au langage C

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Traduction des Langages : Le Compilateur Micro Java

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

RMI le langage Java XII-1 JMF

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Introduction à MATLAB R

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Cours 14 Les fichiers

TP3 : Manipulation et implantation de systèmes de fichiers 1

Création d objet imbriqué sous PowerShell.

OpenPaaS Le réseau social d'entreprise

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

INITIATION AU LANGAGE JAVA

TD/TP PAC - Programmation n 3

TP1. Outils Java Eléments de correction

TP 1. Prise en main du langage Python

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Algorithmique et Programmation, IMA

Programmation Internet en Java

Package Java.util Classe générique

Plateforme PAYZEN. Définition de Web-services

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Programmation Objet I

Java DataBaseConnectivity

Les chaînes de caractères

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

2. Comprendre les définitions de classes

Threads. Threads. USTL routier 1

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Convertisseur BBAN/IBAN

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Exercices sur les interfaces

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Lier Erlang avec d autres langages de programmation

Programmation Objet Java Correction

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Transcription:

Analyse (lexicale, syntaxique) L3 MIAGE Analyse lexicale Université de Lille, France 2014-2015

1 Rappels Rôle de l analyse lexicale Outils 2 Mise en oeuvre Lexème Vers l analyseur syntaxique Codage d un analyseur lexical 3 JFLEX

Rôle de l analyse lexicale Rôle de l analyse lexicale Texte source caractères découpe et regroupe les caractères d entrée en jetons ou lexèmes analyse lexicale lexèmes analyse syntaxique analyse sémantique représentation sémantique

Outils Outils pour l analyse lexicale outils théoriques : langages réguliers automates d états finis outils logiciels génériques (Lex, Flex etc)

Lexème 1 Rappels Rôle de l analyse lexicale Outils 2 Mise en oeuvre Lexème Vers l analyseur syntaxique Codage d un analyseur lexical 3 JFLEX

Lexème Qu est ce qu un lexème? Si l insertion d un séparateur (e.g. espace) au milieu change le sens d une chaîne de caractère, c est un lexème. := affectation : = : puis = "bonjour" chaîne de caractère "bon jour chaîne de caractère mais différente! caseine identificateur case ine mot clé identificateur a=a+1 = a = a + 1 : plusieurs lexèmes! Toujours prendre le plus long préfixe possible pour effectuer la séparation des lexèmes.... si ça ne suffit pas : régles de priorités ex : interdit de préfixer un identificateur par un mot clé : caseine : mot clé case + identificateur ine identificateur (erroné) caseine

Lexème Vocabulaire Une unité lexicale est une suite de caractères qui a une signification collective : identificateur, entier, opérateur etc Un modèle est une régle associée à une unité lexicale qui décrit l ensemble des chaînes qui peuvent correspondre à cette unité lexicale : expression régulière On appel lexème toute suite de caractères d une source qui concorde avec le modèle d une unité lexicale

Vers l analyseur syntaxique Quelles informations transmettre à l analyseur syntaxique? L analyse lexicale est la seule à travailler sur le texte source toute information non transmise à l analyseur syntaxique est perdue! Descripteur de lexème : classe du lexème/unité lexicale : identificateur, entier, les mots clés etc valeur du lexème : chaîne de caractères représentant le lexème numéro de ligne/caractère de début : message d erreur

Vers l analyseur syntaxique Comment transmettre les lexèmes? unique appel à une méthode produisant une liste de lexèmes appels répétés par l analyseur syntaxique à une méthode produisant un lexème à la fois

Vers l analyseur syntaxique Sous quelle forme transmettre les lexèmes? A la sortie de l automate effectuant l analyse lexicale une phase de crible ou identification lexicale peut être mise en oeuvre : reconnaissance de directives de compilation élimination des symboles inutiles (espaces, commentaires) calcul des valeurs numériques ("123 123) reconnaissance et codage des mots clés et des identificateurs : table des symboles : (e.g. table de hachage) une entrée par lexème : e.g. descripteur unique par identificateur enrichissement du descripteur à chaque occurrence seul le couple (classe de lexème, pointeur vers descripteur dans la table) est transmis dans le flot de lexèmes

Codage d un analyseur lexical Codage d un analyseur lexical Construire et optimiser un AFD un peu modifié à la main : reconnaissance du plus long préfixe priorités (e.g. caseine : case prioritaire sur caseine) mémorisation du dernier état final traversé + sous-mot associé retour en arrière possibles tout recommencer en cas de modification des symboles Utiliser un outil de génération d analyseur (lex, flex, jflex etc)

Codage d un analyseur lexical Retour en arrière et complexité de l analyse Reconnaissance du plus long préfixe : parfois n abouti pas! Exemple : aaaaa et mots reconnus par a + a b l analyseur doit reconnaître 5 a successifs 1 plus long préfixe : cherche a b 2 lire les a suivants pour voir qu il n y a pas de b 3 l analyseur doit retourner dans le dernier état final rencontré (un a seul) a reconnu comme a seul les autres a lus doivent retourner dans le flot d entrée 4 retourner à 1 pour les a suivants complexité en n 2 pour analyser une chaîne de n lexèmes a n arrive généralement pas en pratique, mais attention!

1 Rappels Rôle de l analyse lexicale Outils 2 Mise en oeuvre Lexème Vers l analyseur syntaxique Codage d un analyseur lexical 3 JFLEX

Exemple Supposons que vous notiez vos contributions aux personnels de l université dans un fichier : <Sedoglavic,200> <Voge:10> <Charpentier:200> <Je ne sais plus qui,74> <Lesmele,100> <Mahiddine,500>. Vous souhaitez écrire un programme qui transforme ce fichier en un tableau HTML : <TABLE BORDER=1> <TR> <TD>Sedoglavic</TD> <TD>200 euros</td> </TR> <TR> <TD>Voge</TD> <TD>10 euros</td> </TR> <TR> <TD>Charpentier</TD> <TD>200 euros</td> </TR> <TR> <TD>Je ne sais plus qui</td> <TD>74 euros</td> </TR> <TR> <TD>Lesmele</TD> <TD>100 euros</td> </TR> <TR> <TD>Mahiddine</TD> <TD>500 euros</td> </TR> </TABLE>

Fichiers utiles pour la mise en oeuvre Quatre fichiers sont à produire soi même : fichier de données à convertir : 2014-2015.input et wrong.input programme principal qui utilise l analyseur lexical pour produire le code html : Contribution2HTML.java modèle JFlex pour construire l automate de l analyseur lexical : mytry.jflex classe des lexèmes : représentation souhaitée en sortie de l automate : Yytoken.java (nom traditionnel) Le fichier Analyseur2Contribution.java contenant la classe de l automate sera produit par Jflex en plus de tous les.class produits par javac.

Structure d un fichier d entrée JFLex Un fichier JFLEX est composé de 3 sections séparées par %% : 1 le code utilisateur : cette section est incluse telle quelle dans le fichier java engendré. 2 les options et déclarations : cette section influence la classe engendrée. Par exemple, %class foo engendre un fichier java foo.java contenant une classe foo. 3 les règles lexicales : cette section associe à des expressions régulières une action que l analyseur engendré effectue quand il rencontre un lexème reconnu par une de ces expressions (une telle association est une règle lexicale).

JFLex : un générateur d analyseurs lexicaux Le filtre JFLEX prend en entrée un fichier de description de l analyseur lexical et engrendre un fichier Java contenant une classe implantant l automate de l analyseur. La méthode principale de cette classe extrait du texte source le prochain lexème. L utilisateur doit fournir la représentation des lexèmes (cf. Yytoken infra) et le code qui les manipule (cf. Contribution2html infra). Nous allons illustrer le fonctionnement de JFLEX sur notre exemple.

Les composantes de votre filtre Notre programme de conversion Contribution2html se base sur : un analyseur lexicale Analyseur2Contribution implanté dans une classe java qui va être produit par JFLEX à partir d un fichier de description de l analyseur ; une classe Yytoken permettant de représenter et de manipuler les lexèmes que l analyseur lexicale vous retourne ; le format de votre fichier d entrée :. représente la fin du fichier ; < représente le début d une entrée ; > représente la fin d une entrée ; : représente une séparation entre le nom et la somme.

Description de l analyseur lexical (fichier.jflex) : déclarations La première section est vide dans notre exemple. Dans la section des options et des déclarations, on peut spécifier le nom de notre analyseur lexical : %class Analyseur2Contribution ainsi que différentes modèles (classes de lexèmes) : Debut = \< Nom = [A-Z][a-z ]* Association = [:,] Contribution = [0-9]* Fin = \> Blanc = [ \r\n\t\f] PointFinal = \. représentant des expressions régulières décrivant les différentes classes de vos lexèmes.

Description de l analyseur lexical (fichier.jflex) : régles lexicales Section des règles lexicales : on indique quoi faire lorsque l on rencontre une chaîne de caractères reconnue par l une de ces expressions régulières : {PointFinal } { return null ; } {Blanc} { /* les blancs sont ignor\ es */ } {Debut} { return new Yytoken( < ) ; } {Nom} { return new Yytoken(yytext()) ; } {Association} { return new Yytoken( : ) ; } {Contribution} { return new Yytoken(Integer.parseInt(yytext())) ; } {Fin} { return new Yytoken( > ) ; } Par exemple, en cas de terminaison (.), le token retourné est null que notre programme de conversion Contribution2html utilisera pour sortir de sa boucle d analyse des différents lexèmes. La classe java Yytoken le format de sortie des lexèmes reconnus par les expression régulières. Dans ce code pour chaque lexème rencontré, on retourne un objet de classe

Fichier JFLex d entré Au final, on obtient le fichier décrivant l analyseur lexical : %% %class Analyseur2Contribution Debut = \< Nom = [A-Z][a-z ]* Association = [:,] Contribution = [0-9]* Fin = \> Blanc = [ \r\n\t\f] PointFinal = \. %% {PointFinal } { return null ; } {Blanc} { /* les blancs sont ignor\ es */ } {Debut} { return new Yytoken( < ) ; } {Nom} { return new Yytoken(yytext()) ; } {Association} { return new Yytoken( : ) ; } {Contribution} { return new Yytoken(Integer.parseInt(yytext())) ; } {Fin} { return new Yytoken( > ) ; } Notez que l ordre dans cette dernière section défini un ordre de priorité (une chaîne de caractères décrites par plusieurs expressions régulières provoquera la première action associé

Classe java des lexèmes : différent champs du lexèmes nécessaires Dans notre implantation, un lexèmes est donc un objet de type : public class Yytoken { public boolean est_fin = false ; public boolean est_debut = false ; public boolean est_association = false ; public boolean est_entier = false ; public boolean est_nom = false ; public int contribution = 0 ; public String nom = null ; } /* les constructeurs devraient \^etre ici... */ Il ne nous reste plus qu à fournir les différents constructeurs utilisés dans l analyseur lexical selon les cas de figure.

Constructeurs de lexèmes : caractères Les lexèmes se réduisant à un caractère sont de 3 types : public Yytoken(char c) { if (c== : ) this.est_association = true ; else if (c== < ) this.est_debut = true ; else if (c== > ) this.est_fin= true ; } et nous n avons pas besoin de stocker les caractères en question puisqu ils ne sont pas utilisés/affichés.

Constructeurs de lexèmes : noms et entiers Les autres lexèmes possibles sont des chaînes de caractères qui sont soit des noms, soit converties en entiers (cf. le fichier de description de l analyseur lexical) : public Yytoken(String corruptible) { this.est_nom = true ; this.nom = corruptible ; } public Yytoken(int montant) { this.est_entier = true ; this.contribution = montant ; } Il ne nous reste plus qu à recoller les différents morceaux.

Votre programme principal proprement dit Le programme principal extrait des lexèmes grâce à la méthode yylex fourni par l analyseur Analyseur2Contribution et les utilise. import java.io.* ; public class Contribution2HTML { public static void main(string args[]) throws Exception { Analyseur2Contribution lexer ; lexer=new Analyseur2Contribution(new BufferedReader(new FileReader(args[0]))); Yytoken token = null; System.out.println("<TABLE BORDER=1>") ; } } while(true) { /* on extrait le lex\ eme suivant */ token = lexer.yylex(); if (token == null) break ; /* sa conversion se fait lors de l affichage */ if (token.est_debut) System.out.print( "<TR>" ); else if (token.est_fin) System.out.print( "</TR>\n") ; else if(token.est_nom) System.out.print( "<TD>"+token.nom+"</TD>") ; else if(token.est_association) System.out.print( " " ); else if(token.est_entier) System.out.print("<TD>"+token.contribution+"euros</TD>" ); } System.out.println("</TABLE>") ;

Production du convertisseur interprétable prompt > jflex description_analyseur.jflex Reading "description_analyseur.jflex" Constructing NFA : 22 states in NFA Converting NFA to DFA :... 10 states before minimization, 8 states in minimized DFA Old file "Analyseur2Contribution.java" saved as "Analyseur2Contribution.java~" Writing code to "Analyseur2Contribution.java" prompt > javac Yytoken.java prompt > javac Analyseur2Contribution.java prompt > javac Contribution2HTML.java prompt > ls *.class Analyseur2Contribution.class Contribution2HTM.class Yytoken.class prompt > java Contribution2HTML 2014-15.input > 2014-15.html prompt > Dans notre exemple, nous avons insisté sur l analyse lexicale tout en n évoquant pas l analyse syntaxique (l exploitation de la syntaxe du fichier d entrée 2014-15.input).

L analyse est uniquement lexicale! prompt > cat wrong.input <<<Voge <>, 200. prompt > java Contribution2HTML wrong.input>wrong.html prompt > cat wrong.html <TABLE BORDER=1> <TR><TR><TR><TD>Voge </TD><TR></TR> <TD>200 euros</td></table>