Bonjour à tous.
Je souhaiterai développer un petit script javascript, qui ligne par ligne du code javascript.
Pour ça, l'utilisateur rendre du code javascript, et mon programme doit juste afficher un alert contenant chaque instruction.
Première étape sur là quel je bloque, il faudrait que je puisse détecter chaque instruction et ensuite effectuer un traitement spécifique pour chaque instruction.
J'ai décidé d'utiliser l'objet RegExp pour séparer le code de l'utilisateur en plusieurs micro instructions.
Seulement le problème c'est que le langage javascript est très compliqué à analyser.
Je pense que pour mieux comprendre mon problème le mieux serait que je vous donne un exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 /* Cette fonction sert à enlever le prototype de la fonction passer en parametre. ex : function a(){ var x = 'test' ; ... ... ... alert(x) ; } deviendra : var x ='test' ; ... ... ... alert(x) ; */ function getOnlySourceCodeOfFunction(completeFunction){ var expression = new RegExp("^function +.+\\({1,1}.*\\){1,1}\\s*\\{{1,1}([\\s\\S]*)}$","g") ; return (expression.exec(completeFunction)[1]) ; } function getArrayOfMicroInstruction(sourceCode){ /* Ancienne méthode qui marche mais ne recupere pas les doubles voir triple instruction var expression = new RegExp("[^\\s;]([^\\n;]*)[^\\s]","g") ; ex : var c = 'toto '+ \n 'titi' ;\n est une double instruction L'ancienne méthode capturait sa comme 2 instructions bien distincte. Autre probleme elle ne detecte pas les } */ var arrayOfMicroInstruction = new Array() ; var expression = new RegExp("[^\\s;]([^\\n;]+)[^\\s]","g") ; while(expression.test(sourceCode)){ var microInstruction = RegExp.lastMatch ; arrayOfMicroInstruction.push(microInstruction) ; } return arrayOfMicroInstruction ; }Explication du code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var sourceCode = getOnlySourceCodeOfFunction(a) ; var bidon = getArrayOfMicroInstruction(sourceCode) ; for(var i = 0 ; i < bidon.length ; i++){ alert(bidon[i]) ; }
sourceCode contient le code source et uniquement le code source de la fonction a.
En effet sourceCode ne contient pas le prototype de la fonction.
Ensuite j'entre dans bidon un tableau de micro instructions.
Et je les affiches une par une.
Pourquoi sa ne marche pas :
Il semblerai que mon expression régulière qui détermine comment détecter une instruction ne soit pas correcte. Elle ne détecte pas les "}" et les doubles instructions.
Ex :
alert('Coucou' +
'TATA') ;
est une double instructions. puisqu'elle est sur deux lignes.
Petite présition :
Une fin d'instruction en javascript se termine soit par un ';' soit par un '\n'
Pour finir :
Je sais que se problème est très difficile, mais pourriez vous m'aider à le résoudre. Il n'y a qu'une seul ligne à modifié sur mon code source
Merci d'avance.
Cordialement Freezerhm
Partager