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 2 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 3 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 4 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 5 Intégration de JFLEX avec d’autres composantes Spec JFLEX (exp. rég. + actions) JFlex Code source javac Scanner.java IFT313 Scanner.class (Lexical analyzer) Tokens © Froduald Kabanza Analyseur syntaxique (Parser) 6 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 7 Analyseur syntaxique Grammaire + actions sémantiques Code source Scanner.class Java CUP ou JavaCC Parser.java IFT313 Tokens javac Parser.class (Syntactic analysis, Semantic analysis) © Froduald Kabanza Code cible 8 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 9 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 %type Symbol IFT313 /* nom de la méthode retournant le prochain token */ /* type des tokens retournés par la méthode next_token*/ © Froduald Kabanza 10 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 11 Lab2/Example3/scanner.flex (suite) %% /* second %% : début des expressions régulières */ ";" { return symbol(Sym.SEMI); } "+" { return symbol(Sym.PLUS); } "-" { return symbol(Sym.MINUS);} "*" { return symbol(Sym.TIMES); } "/" { return symbol(Sym.DIVIDE); } "%" { return symbol(Sym.MOD);} IFT313 © Froduald Kabanza // Classe Sym 12 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 13 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 14