JFlex. - PLANIART - Université de Sherbrooke

publicité
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
Téléchargement