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

Preview:

Citation preview

1

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

JavaCC

Java compiler’s 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;})* }

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

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"] )* >}

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)

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

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

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é

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

}

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

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.

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

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

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

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

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

Recommended