IFT313
Introduction aux langages formels
Froduald Kabanza
Département d’informatique Université de Sherbrooke
planiart.usherbrooke.ca/kabanza/cours/ift313
JFLEX
IFT313 © Froduald Kabanza
2
Sujet
• Introduction à JFLEX .
IFT313 © Froduald Kabanza
3
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 util-
isant JFLEX.
IFT313 © Froduald Kabanza
4
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
5
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
6
Intégration de JFLEX avec d’autres com- posantes
Analyseur syntaxique
(Parser) Spec JFLEX
(exp. rég. + actions)
JFlex
Scanner.java
javac Scanner.class
(Lexical analyzer) Code
source
Tokens
IFT313 © Froduald Kabanza
7
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
8
Analyseur syntaxique
Grammaire + 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
9
Exemple : scanner pour un calculateur
• Un des exemples d’analyseur syntaxique que nous verrons plus tard consis- tera à 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
10
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
11
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
12
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
13
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
14