les bases d'un interpreteur/et pseudo compilation en *.Exe
Publié : dim. 31/déc./2017 17:56
vous voulez creer votre propre language ?
voici un interpreteur bidon (vraiment pour le coup , mais montre le principe qu'on peut interpréter une ligne de code
sans passer par du chinois
(allusion au bytecode de Grom)
Cette version utilisant une pile d'instruction (liste chainée)
ce qui serai utile notamment pour l'emploi de "procedure" ,saut dans le code, etc ...
rappel cet interpréteur, interprète la ligne de code suivante
vous aurez compris que le but est de faire une boucle "For-Next" 5 fois et d'afficher le compteur
j'ai bien commenté le code, je pense que c'est clair
pour voir le fonctionnement posez un callDebugger au bon endroit
et Tracez pour voir ce qui se passe avec la Liste chainée Pile()
pour info , j’appelle "variable systeme" les variables internes a l'interpreteur
ne pas confondre avec les variables ...
plus tard , je vous ferai un exemple de gestion des variables "utilisateur" c'est assez simple
voici un interpreteur bidon (vraiment pour le coup , mais montre le principe qu'on peut interpréter une ligne de code
sans passer par du chinois


Cette version utilisant une pile d'instruction (liste chainée)
ce qui serai utile notamment pour l'emploi de "procedure" ,saut dans le code, etc ...
rappel cet interpréteur, interprète la ligne de code suivante
Code : Tout sélectionner
"boucle 5 print fin_boucle"
j'ai bien commenté le code, je pense que c'est clair
pour voir le fonctionnement posez un callDebugger au bon endroit
et Tracez pour voir ce qui se passe avec la Liste chainée Pile()
pour info , j’appelle "variable systeme" les variables internes a l'interpreteur
ne pas confondre avec les variables ...
plus tard , je vous ferai un exemple de gestion des variables "utilisateur" c'est assez simple

Code : Tout sélectionner
;***********************************************
;Titre :*interpreteur_base
;Auteur : Zorro
;Date :31/12/2017
;Heure :18:15:53
;Version Purebasic : PureBasic 5.60 (Windows - x86)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune
;***********************************************
; interpreteur bidon
Info.s="INTERPRETEUR"
ligne_code.s="boucle 5 print fin_boucle" ; <<<< ceci est la ligne de code qui sera executée ..
newlist Pile.s()
; Analyse syntaxique (et pose des instructions dans notre pile )
For i=1 to len(ligne_code.s)
extrait.s=stringfield(ligne_code.s,i," ")
select extrait.s
Case "boucle" ; on tombe sur une commande de boucle
addElement(pile.s()) ; on l'ajoute dans la pile d'instruction
pile.s()="boucle"
i=i+1
nb=val(stringfield(ligne_code.s,i," ")) ; comme c'est une boucle, on recupe alors le nombre de boucle a faire (le parametre en fait )
addElement(pile.s()) ; on le pose aussi sur la pile
pile.s()=str(nb)
Case "print" ; on veux afficher un truc ??
addElement(pile.s()) ; on ajoute cette instruction sur la pile
pile.s()= "print"
Case "fin_boucle" ; tien une fin de boucle se presente
addElement(pile.s()) ; comme c'est une instruction reconnu par notre langage, on la pose aussi sur la pile
pile.s()= "fin_boucle"
EndSelect
Next i
;
ResetList(Pile()) ; on met le pointeur de pile a zero
; Execution (l'interpreteur !! )
; Lecture de notre pile d'instruction ET execution a la volée
ForEach Pile() ; pour chaque elements de notre pile , on va traiter
commande.s=Pile()
select commande.s
Case "boucle" ; on tombe sur la fonction boucle (For)
NextElement(pile()) ; comme c'est une boucle, on recupere le parametre de notre boucle (le nombre de fois qu'on va boucler ), il se trouve a la suite de la fonction 'boucle' dans notre pile
nb=val(Pile()); voila parametre recupéré dans notre variable systeme "nb"
pointeur_de_pile_retour=ListIndex(Pile()) ; on met en memoire la position du debut de boucle, comme ça on pourra revenir si boucle pas finie
Case "fin_boucle" ; tiens, on tombe sur la fonction de fin de boucle , il faut verifier si elle est finie ou pas
compteur=compteur+1 ; on met a jour la variable systeme de notre boucle
if compteur<nb ; boucle pas finie
SelectElement(Pile(), pointeur_de_pile_retour) ; on retourn au debut de la boucle (on saute dans la pile a l'emplacement du debut de boucle
Else ; la boucle est fini on a egalé ou depassé nb
goto fin ; ici je termine, mais il faudrai passer a la suite du prg ligne suivante , mais mon exemple n'a qu'une ligne
Endif
Case "print" ; on tombe sur l'instruction d'affichage
MessageRequester("sortie",str(compteur)) ; on execute l'affichage avec un requester, ais ça aurai pu etre une sortie ecran ou que sais-je
EndSelect
Next
Fin: