Page 2 sur 2
Publié : mer. 25/avr./2007 23:42
par minirop
J'ai déjà un petit code qui fonctionne

sinon, pour les boucles et conditions, j'avais penser à mettre le code dans un boucle et faire une fonction récursive, un truc du genre :
Code : Tout sélectionner
global dim code.s(500000) ; je rigole :p
Procedure exec(ligne.l)
i.l = ligne
while ***
str$ = code(i)
; analyse de str$
If str$ = "If"
If cond$ ; si la ocndition du if est vraie
exec(i+1)
Else
i = EndIfLine+1 ; id de la ligne du EndIf conrrespondant trouvé avec une boucle
EndIf
EndIf
If str$ = "EndIf"
ProcedureReturn ; fin du bloc
EndIf
Wend
EndProcedure
Et pour le While, pareil sauf que le "Wend" remet dans i la valeur du while (par ex i-25)
z'en pensez quoi ?
edit : mes premiers tests avec "If" marchent à merveille. Demain (enfin dans quelques heures) je teste avec while
++
Publié : jeu. 26/avr./2007 9:14
par Backup
Publié : jeu. 26/avr./2007 13:00
par minirop
j'ai survolé pourquoi ? (g fé kekchoz 2 mal ?)
Publié : jeu. 26/avr./2007 13:28
par Backup
minirop a écrit :
j'ai survolé pourquoi ? (g fé kekchoz 2 mal ?)
non ! non!

c'etait pour savoir !
et ton system ça marche ?
tu peux mettre un exemple ?

Publié : jeu. 26/avr./2007 13:36
par minirop
Dobro a écrit :et ton system ça marche ?
oui

mais j'ai pas encore implémenté la gestion des expressions
Dobro a écrit :tu peux mettre un exemple ?

le code :
Code : Tout sélectionner
; DEBUG : en attendant mieux !
code(0) = "Let pouet = 3"
code(1) = "Print Entrez la valeur de B : "
code(2) = "Get B"
code(3) = "While B = 1"
code(4) = "PrintN ceci est un bug : B"
code(5) = "Wend"
code(6) = "PrintN blablabla"
code(7) = "Get c"
; END
Et la fonction :
Code : Tout sélectionner
; exécution !
Procedure.l Exec(start.l)
Shared code()
current.l = start
While current < 500
line.s = code(current)
Select(StringField(line.s,1," "))
Case "Let"
vname.s = StringField(line.s,2," ")
vvalue.s = ""
If FindString(line,"=",1)
k.l = 3
While StringField(line,k," ") <> "="
k+1
Wend
k+1
While StringField(line,k," ") = ""
k+1
Wend
vvalue = StringField(line,k-1," ")
If VarExists(vvalue)
vvalue = GetVarValue(vvalue)
EndIf
EndIf
AddVar(vname,vvalue)
Case "Print"
k.l = 2
While StringField(line,k," ")
vvalue = StringField(line,k," ")
If VarExists(vvalue)
vvalue = GetVarValue(vvalue)
EndIf
Print(vvalue)
Print(" ")
k+1
Wend
Case "PrintN"
k.l = 2
While StringField(line,k," ")
vvalue = StringField(line,k," ")
If VarExists(vvalue)
vvalue = GetVarValue(vvalue)
EndIf
Print(vvalue)
Print(" ")
k+1
Wend
PrintN("")
Case "Get"
vname.s = StringField(line,2," ")
vvalue.s = Input()
AddVar(vname,vvalue)
Case "If"
If IsTrue(Right(line,FindString(line," ",1)))
current = Exec(current+1)
Else
pile.l = 0
current+1
While code(current) <> "EndIf" Or pile > 0
If Left(code(current),2) = "If"
pile+1
ElseIf Left(code(current),5) = "EndIf"
pile-1
EndIf
current+1
Wend
EndIf
Case "EndIf"
ProcedureReturn current
Case "While"
If IsTrue(Right(line,FindString(line," ",1)))
Exec(current+1)
current-1
Else
pile.l = 0
current+1
While code(current) <> "Wend" Or pile > 0
If Left(code(current),5) = "While"
pile+1
ElseIf Left(code(current),4) = "Wend"
pile-1
EndIf
current+1
Wend
EndIf
Case "Wend"
ProcedureReturn
EndSelect
current+1
Wend
EndProcedure
suffit de l'appeller en mettant "0" en paramètre pour la lancer.
++
Publié : jeu. 26/avr./2007 14:19
par Backup
heu! je voulais dire un exemple fonctionnel

Publié : jeu. 26/avr./2007 14:50
par minirop
Dobro a écrit :heu! je voulais dire un exemple fonctionnel

pour le moment j'ai presque fini l'implémentation des expressions (juste un petit bug avec les valeurs négatives) dès que çà marche je poste
edit : le voilà :
http://minirop.free.fr/purecaml.rar 
le code est "hard coded" et le fichier texte vous dit quel est ce code.
edit 2 : "Else" est géré !!! hip hip hip ...
Publié : jeu. 26/avr./2007 23:19
par scaraber
*est interesser*
Je vais regarder ce code

, sa me sera utile je pence pour les event de mon jeu
Merci Dobro et Thyphoon