Ce projet a pour objectif de compiler un programme écrit avec le langage While en un programme JavaScript. Nous travaillons en mode agile,les différents sprints ont une durée de une à deux semaines. A chaque fin de sprint,nous fournissons un délivrable pour construire le compilateur. Voici les membres de notre groupe :
Bastien Cloarec
Haozhi Li
Youssouf Maiga
Salifou Nguetcheu
Baptiste Buron
Nous avons créé un dépôt git pour avoir une bonne gestion du projet
git clone http://qfdk.github.io/While2JavaScript && cd While2JavaScript && make
Le langage ciblé étant le JavaScript, la gestion (statique, pile, tas) n'est pas de notre responsabilité.
Lorsqu'on utilise JavaScript, la mémoire est allouée lors de la création des objets puis libérée « automatiquement » lorsque ceux-ci ne sont plus utilisés. Cette libération automatique est appelée garbage collection en anglais ou ramasse-miettes. Le fait que ce processus soit automatique est souvent source de confusion et donne parfois l'impression que JavaScript (ou d'autres langages de haut niveau) ne permet pas de gérer la mémoire : nous allons voir que ce n'est pas le cas.
En 2012, l'ensemble des navigateurs web modernes disposent d'un ramasse-miettes implémentant cet algorithme mark-and-sweep. L'ensemble des améliorations apportées dans ce domaine de JavaScript représentent des améliorations basées sur cet algorithme, ce ne sont pas de nouveaux algorithmes ou une nouvelle définition pour les objets à supprimer.
Pas d'erreur à la l'exécution implique que toutes les variables doivent être initialisés. Nous nous arrangeons à ce qu'il n'y ait pas d'erreur à l’exécution.
La valeur par défaut en while est nil ===> undefined
undefined en javascript signifie variable non initialisé alors que null est utilipsé par le programme pour dire. En faisant seulement var nil, sans initialisation, sa valeur est underfined
var nil;
Le rôle des commande est de modifier l'état de la mémoire.
La commande nop ne fait rien. On la traduit par l'instruction 0+0 par exemple;
console.log()
Nous devons exécuter C1 puis C2. La traduction en JavaScript donnera:
traduction (C1) traduction (C2)
Sa traduction donne :
if (traduction(E)!=nil) traduction(C1) else traduction (C2)
Sa traduction donne :
if (traduction(E)!= nil) traduction(C1)
Sa traduction donne :
while (E!= nil) { traduction(C) }
Sa traduction donne :
int cpt0 = LibWh2JS.countRight(E); for (var i0 = 0; i0 < cpt0; i0++){ traduction(C) }
function function_foreach (X,E) { X=value(E); if(tl(X)!=nil) { function_foreach(X,tl(X)) } if(hd(X)!=nil) { function_foreach(X,hd(X)) } if((tl(X)==nil)&&(hd(X)==nil)) { traduction(X); } }
Les Vi et les Ei designeront les traductions des noms de variable données par la table des variables.
var tampon = new Array(); for (int i=1;i<=n;i++) { tampon.push(Ei) } for(int i=1;i<=n;i++) { Vi = tampon[i]; }
Les Vi et les Ei designeront les traductions des noms de variable données par la table des variables.
var tampon = new Array(); // Pour stocker les write de f executer(f,n,tampon) // Execution de la fonction f ayant n parametres for(int i=0;i<m;i++) { Vi+1 = tampon[i]; }
X désignera la traduction du nom de variable X comme le définit la table des variables.
X'=LibWh2JS.clone(X); feuilleHd=LibWh.getFeuilleHd(X); hd(feuilleHd)= new Tree(X');
// Un construction que nous allons définir X = new BinTree(a,b)
<nop,_,_,_>
<C1,_,_,_>
<C2,_,_,_>
<cons,X,a,b>
<list,X,a,b>
<tl,X,Y,_>
<hd,X,Y,_>
<if C,_,E,_>
<if C1 C2,_,E,_>
<while C,_,E,_>
<for C,_,E,_>
<foreach C,X,E,_>
<and,R,E,E'>
<or,R,E,E'>
<not,R,E,_>
<=?,R,E,E'>
'use strict'; var nil; function Node(data, left, right) { this.data = data; this.left = left; this.right = right; } Node.prototype.getData = function() { return this.data; }; //arbre binaire function Tree(data,dataL,dataR) { this.root = null; this.insert(data,dataL,dataR); } // insert le data //1. test si on a le racine //2. test la valeur < this, 3 sinon 4 //3. //4. Tree.prototype.insert = function(data,dataL,dataR) { this.root = new Node(data, null, null); this.root.left = dataL; this.root.right = dataR; }; Tree.prototype.getRight=function() { return this.root.right; }; Tree.prototype.getLeft=function() { return this.root.left; }; Tree.prototype.getRoot=function() { return this.root; }; // nombre de node totale Tree.prototype.countNode = function(node) { if (!node) return 0; return this.countNode(node.left) + this.countNode(node.right) + 1; }; Tree.prototype.countRight = function() { var tmp = this; var cpt=0; while ((tmp != nil) && (tmp.root != nil)) { cpt++; tmp=tmp.root.right; } return cpt; }; // reuperer une valeur de inputX function getValeur(v) { var rest = document.getElementsByTagName("input")[v]; return rest.value; } var t=new Tree(1,2,0); var t1=new Tree("nil",nil,new Tree("nil",nil,new Tree("nil",nil,new Tree("nil",nil,nil)))); // t.insert(1,2,new Tree(3,5,new Tree(3,5,4))); // console.log(t.getRight().getRight().getRight().getRight()); console.log(t1.countRight());