IFT313 Introduction aux langages formels Froduald Kabanza Département d’informatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313 JFLEX
Sujet Introduction à JFLEX. IFT313 © Froduald Kabanza
Objectif Comprendre comment fonctionne générateur d’analyseur lexical (JFLEX). Lab #2 et TP #2 : Être capable de générer un analyseur lexical en utilisant JFLEX. IFT313 © Froduald Kabanza
Références [2] Appel, A. and Palsberg. J. Modern Compiler Implementation in Java. Second Edition. Cambridge, 2004. Section 2.5 [4] Aho, A., Lam, M., Sethi R., Ullman J. Compilers: Principles, Techniques, and Tools, 2nd Edition. Addison Wesley, 2007. Sections 3.5 [5] JFlex : A Fast Scanner Generator for Java http://planiart.usherbrooke.ca/kabanza/cours/ift313/Tools/jflex-1.4.3.rar IFT313 © Froduald Kabanza
JFLEX JFLEX est un logiciel de génération d’analyseurs lexicaux en Java. Il est écrit en Java. Il est de domaine publique, publié sous la licence GNU. JFLEX signifie Java Fast LEXical-analyzer generator Comme Lex et FLEX sous UNIX. Il a été développé par un groupe de chercheurs en Allemagne. Lab #2 va vous familiariser avec JFLEX. Téléchargement de JFLEX Installation Essaie de quelques exemples simples TP #2 vous permettra de le mettre en pratique . Écrire un analyseur lexical pour un langage donné. IFT313 © Froduald Kabanza
Intégration de JFLEX avec d’autres composantes Spec JFLEX (exp. rég. + actions) JFlex Scanner.java javac Scanner.class (Lexical analyzer) Code source Tokens Analyseur syntaxique (Parser) IFT313 © Froduald Kabanza
JFLEX et les analyseurs syntaxiques Un analyseur lexical généré par JFLEX peut fonctionner avec plusieurs analyseurs syntaxiques. Mais il est surtout facile à interfacer avec un analyseur syntaxique généré par Java CUP. JFLEX est une amélioration d’un autre générateur d’analyseurs lexicaux appelé JLEX développé par Elliot Berk de l’Université Princeton, écrit aussi en Java. IFT313 © Froduald Kabanza
Analyseur syntaxique Grammaire + Code source actions sémantiques Java CUP ou JavaCC Parser.java javac Code source Code cible Parser.class (Syntactic analysis, Semantic analysis) Scanner.class Tokens IFT313 © Froduald Kabanza
Exemple : scanner pour un calculateur Un des exemples d’analyseur syntaxique que nous verrons plus tard consistera à générer un calculateur acceptant des expressions arithmétiques de la forme (3 + 5 * (7 + 5)) Le calculateur sera généré à partir de deux spécifications : Un scanner pour des tokens composant de tels expressions. Un parser (interpréteur) pour des expressions ayant une telle syntaxe. Pour l’instant nous sommes concerné par le scanner. La suite vous explique donc la spécification à donner à JFLEX pour qu’il génère le scanner. IFT313 © Froduald Kabanza
Lab2/Example3/scanner.flex %% /* Premier %%. Mettez ici du code Java à insérer au début du fichier générée, les états lexicaux et les options de JFLEX. Chaque option JLFEX doit commencer par une nouvelle ligne et par un mot clé commencé préfixé par %. Voici des exemples. */ package exemple3; // Sera inséré dans la classe générée, avant ‘main’. %class Scanner; /* Nom de la classe à générer. Voir aussi %extends, %public, % abstract, et %implements */ %implements java_cup.runtime.Scanner /* ajouté à la déclaration de la classe*/ %function next_token /* nom de la méthode retournant le prochain token */ %type Symbol /* type des tokens retournés par la méthode next_token*/ IFT313 © Froduald Kabanza
Lab2/Example3/scanner.flex (suite) %char /* Active le comptage des caractères scanées (yychar). Voir aussi les options %line (yyline) et %column (yycolumn)*/ %{ private Symbol symbol(int type) { return new Symbol(type, yychar, yychar+yytext().length(), yytext()); } %} /* Le code entouré de %{ %} est copié tel quel dans la fichier .java du scanner. Vous mettez dedans toutes les méthodes auxiliaires que vous voulez utiliser dans les actions associées aux expressions régulières. */ %eofval{ return new Symbol(sym.EOF); %eofval} /* Action (code) exécutée lorsque next_token atteint la fin de fichier.*/ IFT313 © Froduald Kabanza
Lab2/Example3/scanner.flex (suite) %% /* second %% : début des expressions régulières */ ";" { return symbol(Sym.SEMI); } // Classe Sym "+" { return symbol(Sym.PLUS); } "-" { return symbol(Sym.MINUS);} "*" { return symbol(Sym.TIMES); } "/" { return symbol(Sym.DIVIDE); } "%" { return symbol(Sym.MOD);} IFT313 © Froduald Kabanza
Lab2/Example3/scanner.flex (suite) "(" { return symbol(sym.LPAREN); } ") " { return symbol(sym.RPAREN); } [0-9]+ { return new Symbol(sym.NUMBER, yychar, yychar+yytext().length(), new Integer(yytext())); } [ \t\r\n\f] { /* ignorer tabulations et sauts de lignes */ } . { System.err.println("Illegal character: "+yytext()); } IFT313 © Froduald Kabanza
Résumé JFlex est un générateur d’analyseurs lexicaux très flexible. Lab 2 et TP 2 ont pour objectif de vous familiariser avec JFlex JFlex sera utilisé plus tard pour générer un analyseur lexical pour Java CUP un outil de génération d’analyseurs syntaxiques. Jflex permet beaucoup d’autres options. Voir le manuel. IFT313 © Froduald Kabanza