faculté i&c, claude petitpierre, andré maurer javacc java compilers compiler (version...

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

Upload: alexandre-evrard

Post on 04-Apr-2015

131 views

Category:

Documents


1 download

TRANSCRIPT

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

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 JavaCC Java compilers compiler (version générant du Javascript)

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

JavaCC(zones de la source)

1. Options

2. Program header

3. Tokens

4. Productions

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

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

options {  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 JavaCC Java compilers compiler (version générant du Javascript)

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

TokensSPECIAL_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 JavaCC Java compilers compiler (version générant du Javascript)

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

Règles de production « pour un parseur d’expressions: 3 + ((x+11)*5 + 8) »

void prog() : {var t;}{   t=expr() <EOF>}

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

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

void term() : {    var t;}{    factor()  ("*" factor()    )*}

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

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 )? optionel

[ x ] même que ci-dessus

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

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

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

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

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

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

Actions à faire générer par le parseur

void expr() : {}{     term()   ( "+" term()        { var x = res.shift(); res[0] += x); }   )* }

2

5

3

8 x

2

5

3

2

5

11x+3

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

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

Exécution des instructions

void term() : {    var t;}{    factor()  ( "*" factor()    { var x = res.shift(); res[0] *= x); }   )*

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

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

Génération d’un programmeexécutable après compilation

void factor() : { var myToken; }{  (      <INTEGER>    {program.print("res.unshift(parseInt("+token.image+"))\n");}    |      myToken = <IDENTIFIER>  { program.print("var x = gEById('"+myToken.image+"').value\n");             program.print("res.unshift(parseInt(x))\n");             keepVarName(myToken.image); }    |      "(" expr() ")"     )}

automatique

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

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

Tokens avec même 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 JavaCC Java compilers compiler (version générant du Javascript)

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

JavaCC: queue des tokens et des “special tokens”

Token

next

specialToken

Token

next

specialTokenToken

next

specialTokenToken

next

specialToken

Token

next

specialToken

special tokens

dans l’ordre inverse

des flèches

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

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

Fichiers à importer        <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 2 premiers fichiers sont créés en compilant un fichier .jj

Le troisième est disponible à l’adresseindiquée

Compilation

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

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

Appel d’une compilationvar resfunction compile() {        res = [ ] source à        try { compiler            initTokenManager();            ExpressionParserTokenManager(                new inputStream(document.getElementById('prog').value)            )            prog() // appel de la production initiale            alert(res[0]) // montre le résultat        } catch (e) {            alert(!e.mess?e:e.mess) // erreurs        }}