• Aucun résultat trouvé

JFLEX IFT313Introduction aux langages formels

N/A
N/A
Protected

Academic year: 2022

Partager "JFLEX IFT313Introduction aux langages formels"

Copied!
14
0
0

Texte intégral

(1)

IFT313

Introduction aux langages formels

Froduald Kabanza

Département d’informatique Université de Sherbrooke

planiart.usherbrooke.ca/kabanza/cours/ift313

JFLEX

(2)

IFT313 © Froduald Kabanza

2

Sujet

• Introduction à JFLEX .

(3)

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.

(4)

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

(5)

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é.

(6)

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

(7)

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.

(8)

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

(9)

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.

(10)

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*/

(11)

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.*/

(12)

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

(13)

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

(14)

IFT313 © Froduald Kabanza

14

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.

Références

Documents relatifs

Objectifs S’initier aux fondements théoriques des langages de programmation, en particulier aux langages formels, à la théorie des automates ainsi qu’`a

Par conséquent, si x, u, et y sont les mots représentés par la figure précédente, tous les mots de la forme xu*y sont accepté par l’automate et font partie du langage Autrement

- Nous avons vu qu’un langage est un ensemble de mots où un mot est une chaîne de symboles (caractères) d’un alphabet fini.. - Pour les langages réguliers (par exemple, le langage

- On vient de voir qu’en calculant First(S) ou First(XYS) on doit tenir compte des non-terminaux qui pourraient dériver la chaîne vide et de ceux qui pourraient les suivre dans

 Parce que les deux règles ont la même fonction d’analyse (c-à-d., la fonction correspondant au non terminal dans la partie gauche de chaque production).. Si elle partagent le

– Si le symbole est un non terminal, l’attribut pourrait être une donnée calculée en utilisant les actions sémantiques. – Une grammaire avec des attributs est appelée

• Pouvoir programmer un analyseur syntaxique récursif pour une grammaire donnée. • Connaître les fondements d’un générateur d’analyseur syntaxique LL tel

- L’action de remplacer une chaînes de symboles au sommet de la pile par un non terminal (partie gauche d’une règle de production) est appelée “reduce” (on réduit la longueur