Vous êtes sur la page 1sur 8

NF11 TP2 : Gnration danalyseur lexical et syntaxique (4 sances)

Objectifs
Crer une grammaire du langage Logo. Faire gnrer un analyseur syntaxique de cette grammaire. Crer une reprsentation intermdiaire dun programme Logo. Crer un interprteur du langage Logo.

Outils
Gnrateur danalyseur lexical et syntaxique (lexer-parser-tree walker) AntLR (another tool for language recognition). Plugin AntLr pour lenvironnement Eclipse. Install sur les stations. Plugin Visual Editor pour lenvironnement Eclipse. Install sur les stations.

Documentation AntLR
Site : Documentation : API : Pour commencer : http://www.antlr.org/ http://www.antlr.org/doc/index.html Site NF11 : http://www4.utc.fr/~nf11/ voir liens utiles/ Documentation AntLR locale http://www.antlr.org/javadoc/overview-summary.html Site NF11 : http://www4.utc.fr/~nf11/ voir liens utiles/ AntLR : Pour commencer

Documentation LOGO
Site NF11 : http://www4.utc.fr/~nf11/ voir liens utiles/ Manuel LOGO

Documentation Java http://java.sun.com/docs/books/tutorial/uiswing/index.html http://java.sun.com/docs/books/tutorial/uiswing/components/components.html

Etape 1 : Installation et Analyseur lexical


Configuration dEclipse

Crer un projet Java Installer le fichier antlt.jar dans le classpath du projet o build path/add external archives et rechercher le fichier : /eclipse/plugins/org.antlr_2.7.6/antlt.jar

Gnrateur danalyseur lexical Lire antlr.pdf. Copier le fichier defaultlogo.g dans le projet. Vrifier que ce fichier souvre dans lditeur AntLr (open with). Etudier la partie lexer du fichier grammaire defaultlogo.g Site NF11, Documentation/Grammaire Logo Introduction Crer un package de mme nom que celui figurant dans le header de la grammaire dans le projet java. Choisir le package pour la gnration des classes dans ce package - properties du fichier .g, ANTLR grammar options, choisir le package Gnrer les classes du lexer avec AntLr - compile ANTLR grammar. On pourra ajouter la rgle lexicale suivante permettant de ne pas prendre en considration les sparateurs :
WS ; : (' ' | '\t' | '\r' '\n' {newline();} | '\n' ) { $setType(Token.SKIP);}

Crer une classe pour tester le lexer (incluant la mthode main) et recopier la mthode parse1 de test qui permet dafficher les tokens dun programme. On crira les instructions dun programme logo dans un fichier (ex : defaultlogo.prg). Pour liminer les erreurs de compilation : source/add import.
public class LogoTestMain { public static void main(String[] args) { parse1("defaultlogo.prg"); } static void parse1(String filename) { try { FileReader f = new FileReader(filename); DefaultLogoLexer lexer = new DefaultLogoLexer(f); Token t = lexer.nextToken(); while (t.getType() != Token.EOF_TYPE) { System.out.println(t.getText() + " - " + t.getType()); t = lexer.nextToken(); } } catch (Exception ex) {

ex.printStackTrace(); } } }

En version java 5.0, on peut crire la mthode suivante permettant de lire un programme partir dune chane tape dans la console :
static void parse1() { Scanner scanner = new Scanner(System.in); System.out.print("Texte : "); String s = scanner.nextLine(); try { LogoLexer lexer = new LogoLexer(new StringReader(s)); Token t = lexer.nextToken(); while (t.getType() != Token.EOF_TYPE) { System.out.println(t.getText() + " - " + t.getType()); t = lexer.nextToken(); } } catch (Exception ex) { ex.printStackTrace(); } }

Tester, ajouter une rgle dans le lexer, gnrer les classes, tester de nouveau. Lexer pour le langage LOGO Etudier le document Manuel Logo. Ecrire quelques units lexicales de la grammaire du langage Logo. On pourra ajouter les expressions arithmtiques en tudiant le fichier expression2.g Gnrer les classes ; tester.

Etape 2 : Analyseur syntaxique


Gnrateur danalyseur syntaxique Etudier la partie parser du fichier grammaire defaultlogo.g. Gnrer les classes du parser avec AntLr. Ajouter une mthode de test dans la classe LogoTestMain.
static void parse2(String filename) { try { FileReader f = new FileReader(filename); DefaultLogoLexer lexer = new DefaultLogoLexer(f); DefaultLogoParser parser = new DefaultLogoParser(lexer); parser.programme(); } catch(Exception ex) { ex.printStackTrace(); } }

Parser pour le langage Logo Ajouter quelques rgles defaultlogo.g ; gnrer les classes ; tester.

Gnrer les classes ; tester.

Etape 3 : Interprteur
Arbre AST (Abstract Syntax Tree) Etudier la partie construction de larbre abstrait du parser du fichier grammaire defaultlogo.g. Gnrer les classes. Ecrire un programme de test pour visualiser la cration de larbre abstrait.
static void parse3(String filename) { try { FileReader f = new FileReader(filename); DefaultLogoLexer lexer = new DefaultLogoLexer(f); DefaultLogoParser parser = new DefaultLogoParser(lexer); parser.programme(); CommonAST parseTree = (CommonAST)parser.getAST(); System.out.println(parseTree.toStringList()); ASTFrame frame = new ASTFrame("Arbre AST", parseTree); frame.setVisible(true); } catch(Exception ex) { ex.printStackTrace(); } }

Aspect graphique Etudier la partie treewalker du fichier grammaire defaultlogo.g. Installer lapplication compose des classes LogoMain, LogoFrame, LogoPanel, Traceur, du package (logo.gui) et du fichier logo_config.xml. Il faut galement ajouter les librairies spring.jar et commons-logging.jar au classpath. Lensemble de ces fichiers se trouve sur le site NF11 (http://www4.utc.fr/~nf11/) Documentation/Matriel TP2 - fichier tp2v14.zip. Excuter lapplication LogoMain ; entrer un programme dans le panel de gauche ; excuter. Cette application permet de visualiser le rsultat de lanalyse syntaxique. Ajouter une rgle au treewalker ; gnrer les classes ; excuter. Cette application donne une ide de ce que peut tre un interprteur du langage Logo. Dans la suite, il est possible de garder cette application ou den crer une autre. Le fichier logo_config.xml doit tre adapt pour changer les noms des lexer, parser, treewalker et des axiomes.

Etape 4 : Lexer, Parser, Interprteur du langage LOGO


De faon cyclique, complter le lexer, le parser et le tree walker du langage LOGO. Modifier la grammaire ; gnrer les classes ; tester. Il ne sagit pas de reprsenter intgralement la grammaire de Logo, mais dimplmenter les lments les plus caractristiques. Ne pas gnrer les synonymes des commandes logo. Une forme suffit. Ne pas gnrer ncessairement toutes les fonctions mathmatiques. Utiliser lcriture arithmtique habituelle et non prfixe (somme m n). Reprsenter : Les principales commandes de la tortue (version courte). les identificateurs, laffectation. La table des mots-cls du langage. la rptition (rpte, tant que). lalternative. les expressions boolennes. les procdures et fonctions. Etudier la rcursivit.

TP2 Exemple de jeu dessai


Programme source
FCC 1 DONNE "X 50 SI :X > 40 [AV 100 TD 90] [RE 50] DONNE "B (5 * :X) REPETE 10 [ SI :X < (:B - 40) [ FPOS [HASARD 50 HASARD 20] REPETE 360 [AV 3 TD 1] ] TG 60 AV :X ]

Arbre abstrait construit par la grammaire Logo

Figure 1 : Arbre AST

Complment : Reprsentation graphique


Pour tablir un interprteur du langage Logo, on part de larbre abstrait. Il permet de crer la table des identificateurs, la table des procdures et de raliser linterprtation dune manire gnrale. La Figure 2 donne un exemple possible de rsultat. La fentre principale contient deux panneaux montrant le programme et lexcution. Larbre abstrait du programme est affich dans un JTreeASTPanel. Cette classe est dfinie dans AntLr. Exemple de cration d' tel panel : un
JPanel leftpanel = New JTreeASTPanel(new JTreeASTModel(getParseTree()), null); La mthode getParseTree est un accesseur sur l' arbre AST : public CommonAST getParseTree() { return parseTree; }

Le second paramtre de la mthode prcdente est un TreeSelectionListener. On pourrait implmenter une classe telle que DefaultTreeSelectionListener, classe implmentant l' interface TreeSelectionListener, en ajoutant un comportement particulier. La construction du panel ncessite la prsence d' second paramtre pouvant un valoir "null".
public class DefaultTreeSelectionListener implements TreeSelectionListener { public void valueChanged(TreeSelectionEvent e) { } }

Figure 2 : Interface graphique

Le second panel est une instance dune classe (LogoPanel) crer hritant de javax.swing.Jpanel. Cest linvocation de la mthode paintComponent qui permet de tracer une figure dans le panel. Il est ncessaire de la surcharger.

public void paintComponent(Graphics g) { // appeler dabord la mthode de la super classe super.paintComponent(g); }

Les deux panels dcrits ci-dessus sont insrs dans un javax.swing.JSplitPane. On peut utiliser la construction interactive d' classe interface l' d' une aide clipse en utilisant lditeur visuel. Pour cela crer une Visual Class.

Travail prsenter et rendre


Faire une dmonstration de linterprteur partir dun programme LOGO. Fichier contenant la grammaire (lexer, parser, treeWalker). Compte-rendu (dizaine de pages) explicitant : les caractristiques de la grammaire, les singularits rencontres et la faon de les traiter. Les singularits peuvent tre dues par exemple des rgles ambigus ou encore correspondre la diffrentiation mots-cl, identificateur de variable. Illustrez la description de ces singularits par des extraits de la grammaire. la modlisation et le fonctionnement de linterprteur (ex : structure des tables, appel et interprtation des procdure, etc.)