Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant...
-
Upload
eloise-beck -
Category
Documents
-
view
115 -
download
0
Transcript of Faculté I&C, Claude Petitpierre, André Maurer 1 JavaCC Java compilers compiler (version générant...
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