- Analyse (lexicale, syntaxique) L3 miage Analyse...

27
Rappels Mise en oeuvre JFLEX Analyse (lexicale, syntaxique) — L3 MIAGE Analyse lexicale Université de Lille, France 2014-2015

Transcript of - Analyse (lexicale, syntaxique) L3 miage Analyse...

Page 1: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Analyse (lexicale, syntaxique) — L3 MIAGE

Analyse lexicale

Université de Lille, France

2014-2015

Page 2: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

1 RappelsRôle de l’analyse lexicaleOutils

2 Mise en oeuvreLexèmeVers l’analyseur syntaxiqueCodage d’un analyseur lexical

3 JFLEX

Page 3: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Rôle de l’analyse lexicale

Rôle de l’analyse lexicale

Texte sourcedécoupe et regroupe les car-actères d’entrée en jetons oulexèmes

caractères

analyse lexicale

lexèmes

analyse syntaxique

analyse sémantique

représentation sémantique

;

Page 4: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Outils

Outils pour l’analyse lexicale

outils théoriques :langages réguliersautomates d’états finis

outils logiciels génériques (Lex, Flex etc)

Page 5: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Lexème

1 RappelsRôle de l’analyse lexicaleOutils

2 Mise en oeuvreLexèmeVers l’analyseur syntaxiqueCodage d’un analyseur lexical

3 JFLEX

Page 6: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Lexème

Qu’est ce qu’un lexème ?

Si l’insertion d’un séparateur (e.g. espace) au milieu change lesens d’une chaîne de caractère, c’est un lexème.

:= affectation 6= : = : puis ="bonjour" chaîne de caractère 6= "bon jour” chaîne decaractère mais différente !caseine identificateur 6= case ine mot clé identificateura=a+1 = a = a + 1 : plusieurs lexèmes !

Toujours prendre le plus long préfixe possible pour effectuer laséparation des lexèmes.... si ça ne suffit pas : régles de prioritésex : interdit de préfixer un identificateur par un mot clé :

caseine : mot clé case + identificateur ine 6= identificateur(erroné) caseine

Page 7: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Lexème

Vocabulaire

Une unité lexicale est une suite de caractères qui a unesignification collective : identificateur, entier, opérateur etc

Un modèle est une régle associée à une unité lexicale quidécrit l’ensemble des chaînes qui peuvent correspondre à cetteunité lexicale : expression régulière

On appel lexème toute suite de caractères d’une source quiconcorde avec le modèle d’une unité lexicale

Page 8: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Vers l’analyseur syntaxique

Quelles informations transmettre à l’analyseursyntaxique ?

L’analyse lexicale est la seule à travailler sur le texte source⇒ toute information non transmise à l’analyseur syntaxique estperdue !

Descripteur de lexème :classe du lexème/unité lexicale : identificateur, entier, lesmots clés etcvaleur du lexème : chaîne de caractères représentant lelexèmenuméro de ligne/caractère de début : message d’erreur

Page 9: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Vers l’analyseur syntaxique

Comment transmettre les lexèmes ?

unique appel à une méthode produisant une liste delexèmesappels répétés par l’analyseur syntaxique à une méthodeproduisant un lexème à la fois

Page 10: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Vers l’analyseur syntaxique

Sous quelle forme transmettre les lexèmes ?

A la sortie de l’automate effectuant l’analyse lexicale une phasede 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 desidentificateurs :

→ table des symboles : (e.g. table de hachage)une entrée par lexème : e.g. descripteur unique paridentificateurenrichissement du descripteur à chaque occurrenceseul le couple (classe de lexème, pointeur vers descripteurdans la table) est transmis dans le flot de lexèmes

Page 11: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

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éfixepriorités (e.g. caseine : case prioritaire sur caseine)mémorisation du dernier état final traversé + sous-motassociéretour en arrière possibles

→ tout recommencer en cas de modification des symboles

Utiliser un outil de génération d’analyseur (lex, flex, jflexetc)

Page 12: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

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?b2 lire les a suivants pour voir qu’il n’y a pas de b3 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 n2 pour analyser une chaîne de n lexèmes a→ n’arrive généralement pas en pratique, mais attention !

Page 13: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

1 RappelsRôle de l’analyse lexicaleOutils

2 Mise en oeuvreLexèmeVers l’analyseur syntaxiqueCodage d’un analyseur lexical

3 JFLEX

Page 14: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Exemple

Supposons que vous notiez vos contributions aux personnelsde 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 fichieren 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>

Page 15: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Fichiers utiles pour la mise en oeuvre

Quatre fichiers sont à produire soi même :fichier de données à convertir : 2014-2015.input etwrong.input

programme principal qui utilise l’analyseur lexical pourproduire le code html : Contribution2HTML.javamodèle JFlex pour construire l’automate de l’analyseurlexical : mytry.jflexclasse des lexèmes : représentation souhaitée en sortie del’automate : Yytoken.java (nom traditionnel)

Le fichier Analyseur2Contribution.java contenant laclasse de l’automate sera produit par Jflex en plus de tousles .class produits par javac.

Page 16: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

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 engendreun fichier java foo.java contenant une classe foo.

3 les règles lexicales : cette section associe à desexpressions régulières une action que l’analyseurengendré effectue quand il rencontre un lexème reconnupar une de ces expressions (une telle association est unerègle lexicale).

Page 17: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

JFLex : un générateur d’analyseurs lexicaux

Le filtre JFLEX prend en entrée un fichier de description del’analyseur lexical et engrendre un fichier Java contenant uneclasse implantant l’automate de l’analyseur.La méthode principale de cette classe extrait du texte source leprochain 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 notreexemple.

Page 18: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Les composantes de votre filtre

Notre programme de conversion Contribution2html sebase sur :

un analyseur lexicale Analyseur2Contribution —implanté dans une classe java — qui va être produit parJFLEX à partir d’un fichier de description de l’analyseur ;une classe Yytoken permettant de représenter et demanipuler les lexèmes que l’analyseur lexicale vousretourne ;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.

Page 19: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

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 peutspé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 lesdifférentes classes de vos lexèmes.

Page 20: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Description de l’analyseur lexical (fichier.jflex) : régleslexicales

Section des règles lexicales : on indique quoi faire lorsque l’onrencontre une chaîne de caractères reconnue par l’une de cesexpressions 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é estnull que notre programme de conversionContribution2html utilisera pour sortir de sa boucled’analyse des différents lexèmes.

La classe java Yytoken le format de sortie des lexèmesreconnus par les expression régulières. Dans ce code pourchaque lexème rencontré, on retourne un objet de classeYytoken (surcharge des constructeurs).

Page 21: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

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 depriorité (une chaîne de caractères décrites par plusieursexpressions régulières provoquera la première action associérencontrée).

Page 22: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Classe java des lexèmes : différent champs dulexè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 constructeursutilisés dans l’analyseur lexical selon les cas de figure.

Page 23: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

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 enquestion puisqu’ils ne sont pas utilisés/affichés.

Page 24: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Constructeurs de lexèmes : noms et entiers

Les autres lexèmes possibles sont des chaînes de caractèresqui sont soit des noms, soit converties en entiers (cf. le fichierde 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.

Page 25: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Votre programme principal proprement ditLe programme principal extrait des lexèmes grâce à la méthodeyylex fourni par l’analyseur Analyseur2Contribution etles 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>") ;}

}

Page 26: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

Production du convertisseur interprétable

prompt > jflex description_analyseur.jflexReading "description_analyseur.jflex"Constructing NFA : 22 states in NFAConverting NFA to DFA :........10 states before minimization, 8 states in minimized DFAOld file "Analyseur2Contribution.java" saved as "Analyseur2Contribution.java~"Writing code to "Analyseur2Contribution.java"prompt > javac Yytoken.javaprompt > javac Analyseur2Contribution.javaprompt > javac Contribution2HTML.javaprompt > ls *.classAnalyseur2Contribution.class Contribution2HTM.class Yytoken.classprompt > java Contribution2HTML 2014-15.input > 2014-15.htmlprompt >

Dans notre exemple, nous avons insisté sur l’analyse lexicaletout en n’évoquant pas l’analyse syntaxique (l’exploitation de lasyntaxe du fichier d’entrée 2014-15.input).

Page 27: - Analyse (lexicale, syntaxique) L3 miage Analyse lexicalemailliet/portail/AS/documents/g1/slides... · Rappels Mise en oeuvreJFLEX Lexème Qu’est ce qu’un lexème ? Si l’insertion

Rappels Mise en oeuvre JFLEX

L’analyse est uniquement lexicale !

prompt > cat wrong.input

<<<Voge <>, 200 .prompt > java Contribution2HTML wrong.input>wrong.htmlprompt > cat wrong.html<TABLE BORDER=1><TR><TR><TR><TD>Voge </TD><TR></TR><TD>200 euros</TD></TABLE>