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; } }