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
Faculté I&C, Claude Petitpierre, André Maurer options { STATIC = true; } PARSER_BEGIN(ExpressionCompiler) // Header class 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 Tokens SPECIAL_TOKEN : // ignorés dans la grammaire, mais mémorisés { | | | | } TOKEN : { | | | | } TOKEN : { | <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 dexpressions: 3 + ((x+11)*5 + 8) » void prog() : { var t; } { t=expr() } void factor() : { } { ( | | "(" 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() + ( ) * endTag() } ( x )* 0 – n fois ( x )+ 1 – n fois ( x )? optionel [ x ] même que ci-dessus
Faculté I&C, Claude Petitpierre, André Maurer LOOKHEAD void 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); } )* } x x+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 dun programme exécutable après compilation void factor() : { var myToken; } { ( {program.print("res.unshift(parseInt("+token.image+"))\n");} | myToken = { 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 : { | } Texte lu: : :aaa Le token choisi est celui qui est le plus long possible. Sil 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 specialToken Token next specialToken Token next specialToken Token next specialToken special tokens dans lordre inverse des flèches
Faculté I&C, Claude Petitpierre, André Maurer Fichiers à importer Les 2 premiers fichiers sont créés en compilant un fichier.jj Le troisième est disponible à ladresse indiquée Compilation
Faculté I&C, Claude Petitpierre, André Maurer Appel dune compilation var res function 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 } }