Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant...

16
1 Faculté I&C, Claude Petitpierre, André Maurer JavaCC Java compiler’s compiler (version générant du Javascript)

Transcript of Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant...

Page 1: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

1

Faculté I&C, Claude Petitpierre, André Maurer

JavaCC

Java compiler’s compiler(version générant du Javascript)

Page 2: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

2

Faculté I&C, Claude Petitpierre, André Maurer

Source lue par JavaCC1. Options

2. Program header

3. Tokens

4. Productions

options {  STATIC = true;}

PARSER_BEGIN(ExpressionCompiler)class ExpressionCompiler{    var variables = new Array(); // Javascript == Java} // (exemple)PARSER_END(ExpressionCompiler)

TOKEN :{ // nom du fichier résultant   <RIGHT_PAREN: ")" >| <PLUS: "+" >}

void expr() : { }{     term()  ("+" term() {génération de code;})* }

Page 3: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

3

Faculté I&C, Claude Petitpierre, André Maurer

options { // obligatoire, seule possibilité   STATIC = true;}

PARSER_BEGIN(ExpressionCompiler) // Headerclass ExpressionCompiler{    var variables = new Array(); // Javascript == Java    var varMap  = new Array();

    function keepVarName(name) { // code auxiliaire          if (varMap[name] == undefined) {  // si nécessaire              varMap[name] = true;              variables.push(name);           }      }}PARSER_END(ExpressionCompiler)

Option + header

Page 4: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

4

Faculté I&C, Claude Petitpierre, André Maurer

Exemples de tokens

SPECIAL_TOKEN : // ignorés dans la grammaire, mais mémorisés{  < SPACE: " ">| < NBSP: "\240">| < CR: "\r">| < TABULATION: "\t">| < NEW_LINE: "\n">}

TOKEN :{  <RIGHT_PAREN: ")" >| <LEFT_PAREN: "(" >| <PLUS: "+" >| <STAR: "*" >| <MINUS: "-" >}

TOKEN :{  <INTEGER: ["0"-"9"] ( ["0"-"9"] )*>|  <IDENTIFIER:  ( ["a"-"z"] | ["A"-"Z"] )  ( ["a"-"z"]  |  ["A"-"Z"]  | ["0"-"9"] )* >}

Page 5: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

5

Faculté I&C, Claude Petitpierre, André Maurer

Règles de production

// principal

void prog() : {}{   expr() <EOF>}

void factor() : {}{    (      <INTEGER>          |      <IDENTIFIER>     |      "(" expr() ")"     )}

void expr() : {}{     term()  ("+" term() )* }

void term() : {}{    factor()  ("*" factor()    )*}

Parseur d’expressions: 3 + ((x+11)*5 + 8)

Page 6: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

6

Faculté I&C, Claude Petitpierre, André Maurer

Répétitions

void product() :

{ /*déclarations, init*/ }

{

( tag() ) +

( <ID> ) *

endTag()

}

( x )* 0 – n fois

( x )+ 1 – n fois

( x )? optionnel

[ x ] même que ci-dessus

Page 7: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

7

Faculté I&C, Claude Petitpierre, André Maurer

LOOKAHEADvoid statement() : { var nb = 0;}{      "add" ( LOOKAHEAD (3)                    "A" "," nb=number()                           |   "A" "," "B" 

                  | LOOKAHEAD ( "B" "," number() )                    "B" "," nb=number()                  |  "B" "," "B"                   ) }

Page 8: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

8

Faculté I&C, Claude Petitpierre, André Maurer

Génération de codevoid factor() : { var t; } { ( t=<INTEGER> {res.push(parseInt(t.image));} | <IDENTIFIER> {res.push(token.image);} | "(" expr() ")" ) }

// note: token est défini par défaut, il correspond au

// dernier token rencontré

Page 9: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

9

Faculté I&C, Claude Petitpierre, André Maurer

Transmission de variables

void factor(entier) : {

var t;

}

{

( t=<INTEGER>

{res.push(parseInt(t.image)+entier);}

| "(" expr() ")"

)

{ return t.image; }

}

Page 10: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

10

Faculté I&C, Claude Petitpierre, André Maurer

Génération d’un programme exécutablevoid factor() : { var myToken; }{  (      <INTEGER>    { print("res.unshift(parseInt("+token.image+"))\n");}    |      myToken = <IDENTIFIER>  { print("var x = g..ById('"+myToken.image+"').value\n");             print("res.unshift(parseInt(x))\n");             keepVarName(myToken.image); }    |      "(" expr() ")"     )}

Page 11: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

11

Faculté I&C, Claude Petitpierre, André Maurer

Tokens avec mêmes débuts

TOKEN :

{ < COLON: ":" >

| < ID: ":" (["a"-"z])* >

}

Texte lu:

:234 <COLON> 2 3 4

:aaa <ID>

Le token choisi est celui qui est le plus long possible. S’il y a

deux solutions de même longueur, la première est sélectionnée.

Page 12: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

12

Faculté I&C, Claude Petitpierre, André Maurer

JavaCC: queue des tokens et des “special tokens”

Token

next

specialToken

image

Token

next

specialToken

imageToken

next

specialToken

image

Token

next

specialToken

image

Token

next

specialToken

image

special tokensapparaissant dans l’ordre inversedes flèches

tous les tokens du fichier lu

on peut sauver le premier pour les parcourir tous à la fin de la compilation

Page 13: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

13

Faculté I&C, Claude Petitpierre, André Maurer

Compilation

Fichiers générés

ExpressionParser.js : le parseur

ExpressionParserTokenManager.js : détection des tokens

ExpressionParserConstants.js : numéro de chaque token

Page 14: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

14

Faculté I&C, Claude Petitpierre, André Maurer

Appel des compilateurs générés par JavaCC

var resfunction compile() { source à        try { compiler            initTokenManager();            ExpressionParserTokenManager(                new inputStream( sourceString )            )            prog() // appel de la production initiale            alert(res[0]) // montre le résultat créé par le parseur        } catch (e) {            alert(!e.mess?e:e.mess) // erreurs        }}

Page 15: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

15

Faculté I&C, Claude Petitpierre, André Maurer

Fichiers à importer dans l'application précédente

<script type="text/javascript" src="ExpressionParser.js"></script><script type="text/javascript" src="ExpressionParserTokenManager.js"></script><script type="text/javascript" src="/LemanOS/Js/Stream.js">

Les deux premiers sont générés par JavaCC (les constantes ne sont pasnécessaires)Le troisième contient la gestion de la source à parser et compiler

Page 16: Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant du Javascript)

16

Faculté I&C, Claude Petitpierre, André Maurer

Actions à faire générer par le parseur

void expr() : {}{     term()   ( "+" term()        { res.push(res.pop()+res.pop()); }   )* }

2

5

3

8 pop

2

5

3

2

5

11poppush