JFlex : Un générateur de scanner pour JAVA Pierre Chauvet Institut de Mathématiques Appliquées
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
Installation de JFlex - Téléchargement - Ajustements pour l utilisations
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
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.)
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é
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
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
Génération de scanners - Qu est-ce qu un scanner? - Description du lexique - Scanner pour expression arithmétique
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;} Scanner Parser if (b==true) {dec.px=col[i].val;} if (b==true) {dec.px=col[i].val;} 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.
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
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 sous- répertoire un fichier *.flex (s en inspirer pour créer son propre lexique ).
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
Description Scanner pour du expression lexique arithmétique Lexique décrit dans le fichier «arithmetic.flex» Définition des «mots» du lexique (tokens)
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».
Utilisation d un scanner - Description du scanner - Utilisation - Parser
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;}
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 FileWriter("Sortie.txt"))); b=true; do { token=scanner.yylex(); b=!scanner.ateof(); if(b) { System.out.println(token.toString()); fi.println(token.tostring()); } } while(b); fi.close(); return true; }
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; } }