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
Dobro a écrit :est tu aller lire ici ?

http://www.purebasic.fr/french/viewtopic.php?t=6514
8O
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! :D c'etait pour savoir ! :D

et ton system ça marche ?

tu peux mettre un exemple ? 8O

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 ? 8O
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 :D

Publié : jeu. 26/avr./2007 14:50
par minirop
Dobro a écrit :heu! je voulais dire un exemple fonctionnel :D
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 :wink:

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