faculté i&c, claude petitpierre, andré maurer javacc java compilers compiler (version...
TRANSCRIPT
Faculté I&C, Claude Petitpierre, André Maurer
JavaCC Java compiler’s 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
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
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"] )* >}
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() )*}
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
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" ) }
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
Faculté I&C, Claude Petitpierre, André Maurer
Exécution des instructions
void term() : { var t;}{ factor() ( "*" factor() { var x = res.shift(); res[0] *= x); } )*
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
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.
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
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
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 }}