JFlex : Un générateur de scanner pour JAVA

publicité
Pierre Chauvet - IMA
JFlex :
Un générateur de
scanner pour JAVA
Pierre Chauvet
Institut de Mathématiques Appliquées
Pierre Chauvet - IMA
Plan du cours
1. Installation de JFlex
- Téléchargement
- Ajustements pour l’utilisation
2. Génération de scanners
- Qu’est-ce qu’un scanner ?
- Description du lexique
- Scanner pour expression arithmétique
3. Utilisation d’un scanner
- Description du scanner
- Utilisation
- Parser
Pierre Chauvet - IMA
Installation de
JFlex
- Téléchargement
- Ajustements pour l’utilisations
Pierre Chauvet - IMA
Téléchargement
L’adresse du site de JFlex est:
http://jflex.de/
- Cliquer sur « Download »
- Choisir « JFlex + all documentation » et cliquer sur le fichier
zip (jflex-num_version.zip)
- Décompresser où vous voulez l’installer
Pierre Chauvet - IMA
Téléchargement
Le fichier zip une fois décompressé se présente sous la forme:
Fichier batch jflex.bat (à
modifier « à la main »)
Documentation (en anglais)
Exemples de syntaxes et de
scanners correspondants
Application JFlex.jar :
générateur de scanners
Sources et outils (Ant, etc.)
Pierre Chauvet - IMA
Ajustements
Trois possibilités:
- Modifier le fichier \bin\jflex.bat pour que les chemins soient
corrects
- Créer votre propre fichier batch avec les commandes les plus
courantes et utiles
- Intégrer la ligne de commande de JFlex dans votre éditeur
préféré…
Pierre Chauvet - IMA
Ajustements
Modifier le fichier \bin\jflex.bat pour que les chemins soient
corrects:
@echo off
REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs
REM (please do not add a trailing backslash)
set JFLEX_HOME=C:\JFLEX
REM only needed for JDK 1.1.x:
set JAVA_HOME=C:\JAVA
à modifier
REM ------------------------------------------------------------------set CLPATH=%JAVA_HOME%\lib\classes.zip;%JFLEX_HOME%\lib\JFlex.jar
REM for JDK 1.1.x
%JAVA_HOME%\bin\java -classpath %CLPATH% JFlex.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
REM for JDK 1.2
rem java -Xmx128m -jar %JFLEX_HOME%\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
Pierre Chauvet - IMA
Ajustements
Créer votre propre fichier batch avec les commandes les plus
courantes et utiles :
java -jar D:\3_IMA\Cours_Java\JFlex\lib\JFlex.jar -v %F
Pierre Chauvet - IMA
Génération de
scanners
- Qu’est-ce qu’un scanner ?
- Description du lexique
- Scanner pour expression arithmétique
Pierre Chauvet - IMA
Qu’est-ce qu’un scanner ?
Un langage (informatique tel que Java ou XML) nécessite :
- un lexique : ensemble des mots du langage (vocabulaire)
- une grammaire : règles d’agencement des mots du lexique
if (b==true)
{dec.px=col[i].val;}
if (b==true)
{dec.px=col[i].val;}
if (b==true)
{dec.px=col[i].val;}
if (b==true)
{dec.px=col[i].val;}
if (b==true)
{dec.px=col[i].val;}
Scanner
Parser
Scanner = Analyseur Lexical :
Outil qui permet de parcourir un texte (chaîne de caractères)
en le décomposant sous la forme d’une suite de mots relatifs
à un lexique donné.
On appelle souvent ces mots des tokens.
Pierre Chauvet - IMA
Qu’est-ce qu’un scanner ?
Exemple : expression arithmétique
le lexique est formé de
( ; ) ; + ; - ; * ; / ; entiers ; réels ; fonctions ; constantes ;
où
- entiers=suite de caractères dans {0,…,9}
- réels=suite de caractères dans {0,…,9} + « . » + suite de
caractères dans {0,…,9}
- fonctions={sin , cos , exp , …}
- constantes={pi , e , …}
Décomposer « 2*(4+sin(pi))/2.46 » en tokens…
Pierre Chauvet - IMA
Description du lexique
Avec JFlex un lexique est décrit dans un fichier *.flex :
c’est un fichier texte qui respecte un lexique et une
grammaire !
Le répertoire Examples contient dans chaque sousrépertoire un fichier *.flex (s’en inspirer pour créer son
propre lexique …).
Pierre Chauvet - IMA
Scanner pour expression arithmétique
Lexique décrit dans le fichier « arithmetic.flex »
Génère une classe publique
appelée ArithmLexer, qui
implémente l’interface cst
Définition d’ensemble de
caractères
Pierre Chauvet - IMA
Description
Scanner
pourduexpression
lexique arithmétique
Lexique décrit dans le fichier « arithmetic.flex »
Définition des « mots »
du lexique (tokens)
Pierre Chauvet - IMA
Scanner pour expression arithmétique
La commande :
java -jar D:\3_IMA\Cours_Java\JFlex\lib\JFlex.jar -v arithmetic.flex
produit le fichier:
« ArithmeticLexer.java »
qui contient la classe « ArithmeticLexer ».
Pierre Chauvet - IMA
Utilisation
d’un scanner
- Description du scanner
- Utilisation
- Parser
Pierre Chauvet - IMA
Description du scanner
Dépend du lexique défini dans le fichier *.flex
C’est une classe publique qui implémente éventuellement
une interface dans laquelle sont définis des constantes
représentant les tokens.
Elle peut s’utiliser conjointement avec d’autres classes
JAVA:
-Yytoken.java (très utile)
- Utility.java (affiche messages d’erreur)
Pour détecter simplement (et élégamment ?) la fin de
fichier, j’ajoute systématiquement cette méthode:
public boolean atEOF( ) {return zzAtEOF;}
Pierre Chauvet - IMA
Utilisation
Le scanner généré par jflex.jar s’utilise typiquement de la
manière suivante:
public boolean parse(String fname) {
boolean b;
try {
ArithmLexer scanner = new ArithmLexer( new java.io.FileReader(fname) );
PrintWriter fi= new PrintWriter(new
new BufferedWriter(new
new FileWriter("Sortie.txt")));
b=true;
do {
token=scanner.yylex();
b=!scanner.atEOF();
if(b)
{
if
System.out.println(token.toString());
fi.println(token.toString());
}
} while(b);
while
fi.close();
return true;
}
…
Pierre Chauvet - IMA
Utilisation
Suite (blocs catch):
…
catch (java.io.FileNotFoundException e) {
System.out.println("File not found : \""+fname+"\"");
return false;
}
catch (java.io.IOException e) {
System.out.println("IO error scanning file \""+fname+"\"");
System.out.println(e);
return false;
}
catch (Exception e) {
System.out.println("Unexpected exception:");
e.printStackTrace();
return false;
}
}
Téléchargement