IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke JavaCC
IFT313© Froduald Kabanza2 Objectifs Introduction à JavaCC
IFT313© Froduald Kabanza3 Références [2] Appel, A. and Palsberg. J. Modern Compiler Implementation in Java. Second Edition. Cambridge, – Sections 3.4 à 3.5 [6] JavaCC : A parser / scanner generator for Java:
ATTRIBUTS SÉMANTIQUES IFT313© Froduald Kabanza4
IFT313© Froduald Kabanza5 Attributs dans JavaCC JavaCC ne fait pas que valider la syntaxe. Avec les attribut sémantiques, JavaCC permet: –Deffectuer des calculs à la volé (exemple Calc1) –De construire un arbre syntaxique abstrait (exemple Calc2 ci-après); Limites avec JavaCC: –Un seul attribut par symbole. –Une seule passe dévaluation. Pour aller au-delà, il faut utiliser dautres outils ou des méthodes adhoc pour évaluer les attributs (avec laide loutil JJTree). Ceci est au-delà du cours..
IFT313© Froduald Kabanza6 CalcParser PARSER_BEGIN(Parser) package calcsParser; import java.io.*; public class Parser { … } parser.Expr_list(); } PARSER_END(Parser) SKIP : { " " | "\t" | "\n" | "\r" } TOKEN : { | }
IFT313© Froduald Kabanza7 CalcParser (Suite) void Expr_list () : {} {(E() )* } void E () : {} {T() ( T () ) *} void T () : {} {F() ( F())*} void F () : {} { | E() }
8 Calc1 void Expr_list() : { int a; System.out.println("Please type in an arithmetic expression followed by a \";\" or ^D to quit:" + "\n"); } { ( a=E() { System.out.println(" =" + a + "\n"); System.out.println("Please type in another expression followed by a \";\" or ^D to quit:" + "\n"); } )* } int E () : { int a, i; } { a=T() ( i=T() { a = a + i; })* { return a; } } IFT313© Froduald Kabanza
9 Calc1 (Suite) int T() : { int a, i; } { a=F() ( i=F() { a = a * i; })* { return a; } } int F() : { Token t; int a = 0; } { t= { return Integer.parseInt(t.image); } | a=E() { return a; } } IFT313© Froduald Kabanza
10 Calc2 void Expr_list() :{ Exp e; System.out.println("Please type in an arithmetic expression followed by a \";\" or ^D to quit:" + "\n"); } { ( e=E() { System.out.println(" =" + e.eval() + "\n"); System.out.println("Please type in another expression followed by a \";\" or ^D to quit:" + "\n"); } )* } Exp E () : { Exp e1, e2; } { e1=T() ( e2=T() { e1 = new PlusExp(e1,e2); } | e2=T() { e1 = new MinusExp(e1,e2); } )* { return e1; } } IFT313© Froduald Kabanza
11 Calc2 (Suite) Exp T() :{ Exp e1, e2; } { e1=F() ( e2=F() { e1 = new TimesExp(e1,e2); } | e2=F() { e1 = new DivideExp(e1,e2); } )* { return e1; } } Exp F() : { Token t; Exp e; } { t= { return new NumberLiteral(t.image); } | e=E() { return e; } } IFT313© Froduald Kabanza
GÉRER LES CONFLITS FIRST/FOLLOW IFT313© Froduald Kabanza12