- Analyse (lexicale, syntaxique) L3 miage Analyse...
Transcript of - Analyse (lexicale, syntaxique) L3 miage Analyse...
Rappels Mise en oeuvre JFLEX
Analyse (lexicale, syntaxique) — L3 MIAGE
Analyse lexicale
Université de Lille, France
2014-2015
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
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
;
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)
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
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
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
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
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
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
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)
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 !
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
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>
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.
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).
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.
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.
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.
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).
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).
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.
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.
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.
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>") ;}
}
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).
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>