je m'interesse également à ce "genre de choses"...
regarde mon code..
c'est basé sur un source de basic écrit en C
chercher DDSBASIC sur google...
Tu peux également regarder du coté des pascals ecrit en pascal
pascal de Wirth par exemple (la base du turbo pascal de borland)
chercher 1975-Wirth ou 1975-PL-0 sur google
mais transformer du pascal en pb, c'est hard, vaut mieux partir d'un source C, c'est plus simple...
Code : Tout sélectionner
#LMAX = 9999
#VERSION = "Basic (console) v0.4 - 01/02/04"
Dim prog_source.s(#LMAX)
Global buffer.s
Global numero_ligne.l
Global car.b
Procedure affiche_aide()
PrintN("")
PrintN(#VERSION)
PrintN("")
PrintN("Commande en mode immediat :")
PrintN("")
PrintN("RUN LIST NEW LOAD "+Chr(34)+"filename"+Chr(34))
PrintN("BYE SAVE "+Chr(34)+"filename"+Chr(34)+" HELP")
PrintN("")
PrintN("Commandes de programmation :")
PrintN("")
PrintN("PRINT "+Chr(34)+"string"+Chr(34))
PrintN("CLS ")
PrintN("")
EndProcedure
Procedure.s ExtractString(texte.s)
result.s = ""
posit_guillemet.w = FindString(texte,Chr(34),1)
For i = posit_guillemet To Len(texte)
If Mid(texte,i,1)<>Chr(34)
result = result+ Mid(texte,i,1)
EndIf
Next i
ProcedureReturn result
EndProcedure
Procedure StockLigneDeCode()
CallDebugger
numero_ligne = Val(buffer)
pos_debut_code.b = 0
exit_while.b = 0
; supprime la ligne dans la table
If prog_source(numero_ligne)<>""
prog_source(numero_ligne)=""
EndIf
; place le restant de la ligne de code dans la table prog_source()
pos_debut_code=1
While exit_while=0
car =Asc(Mid(buffer,pos_debut_code,1))
If car>=48 And car<=57
pos_debut_code+1
Else
exit_while=1
EndIf
Wend
prog_source(numero_ligne)=Mid(buffer,pos_debut_code,Len(buffer))
EndProcedure
If OpenConsole()
sortie_programme.b = 0
prog_source(#LMAX) = "E" ; "END"
affiche_aide()
While sortie_programme = 0
Print("> ")
buffer = Input()
PrintN("")
car = Asc(UCase(Left(buffer,1)))
Select car
Case Asc("B") ; BYE = quitte le programme
sortie_programme = 1
Case Asc("C")
ClearConsole()
Case Asc("H")
affiche_aide()
Case Asc("L") ; LIST = liste le programme
If UCase(Left(buffer,2)) = "LI"
For numero_ligne = 0 To #LMAX-1
If prog_source(numero_ligne )<>""
PrintN (Str(numero_ligne )+" "+prog_source(numero_ligne )) ;
EndIf
Next numero_ligne
EndIf
If UCase(Left(buffer,2)) = "LO"
nomfichier.s = ExtractString(buffer)
If OpenFile(0,nomfichier)
buffer = ""
While Lof()<>Loc()
buffer = ReadString()
StockLigneDeCode()
Wend
CloseFile(0)
EndIf
EndIf
Case Asc("N")
For numero_ligne = 0 To #LMAX
prog_source(numero_ligne ) = ""
Next numero_ligne
prog_source(#LMAX) = "E" ; "END"
Case Asc("R") ; RUN = execute le programme
CallDebugger
numero_ligne = 0 : interpretation = 0
; tant qu'il y des lignes de code à executer
While interpretation = 0
; recherche dans la table la premiere ligne de code à executer
While Len(prog_source(numero_ligne))=0
numero_ligne+1
;Debug Str(numero_ligne)+" "+prog_source(numero_ligne)
Wend
ligne_de_commande.s = prog_source(numero_ligne)
;; supprime espace avant et apres ligne de commande
ligne_de_commande = LTrim(ligne_de_commande)
ligne_de_commande = RTrim(ligne_de_commande)
car.b = Asc(UCase(Left(ligne_de_commande,1)))
Select car
Case Asc("C")
ClearConsole()
Case Asc("P")
If UCase(Left(ligne_de_commande,3)) = "PRI"
; affiche les caracteres apres les guillemets
texte_a_afficher.s = ExtractString(ligne_de_commande)
PrintN(texte_a_afficher)
EndIf
Case Asc("E")
interpretation = 1
EndSelect
numero_ligne+1
Wend
Case Asc("S")
nomfichier.s = ExtractString(buffer)
If OpenFile(0,nomfichier)
For numero_ligne = 0 To #LMAX
If prog_source(numero_ligne )<>""
WriteStringN(Str(numero_ligne)+prog_source(numero_ligne ) )
EndIf
Next numero_ligne
CloseFile(0)
EndIf
Default
StockLigneDeCode()
EndSelect
Wend
CloseConsole()
EndIf
ça sauve des fichiers, ça les relits, ça les listes, ça les executes...
c'est une méthode de travail...
si tu jettes un oeil sur les source pascal, tu verras qu'il utilise, une fonction
Code : Tout sélectionner
Procedure.b CaractereSuivant(t.s)
Result.b=0
If Pos <= Len(t)
car = Mid(t,Pos,1)
If Pos < Len(t) ; lit un caractere en avance
cadr = Mid(t,Pos+1,1)
Result = 2
EndIf
Pos = Pos +1
Result=1
EndIf
ProcedureReturn Result
EndProcedure
le principe :
pour chaque ligne de code, lire caractere par caractere
et s'arranger pour reconnaitre les symboles au fur et à mesures de leur apparition... ( j'ai essayé/explorer un peu toutes les méthodes(dont le stringfield) )
fais des recherches sur caractere suivant réalisation compilateur interpreteur .... je peux te passer mes sources si tu le souhaites ( mais il vaut mieux expérimenter par soi-même
pour les tokens, hum, c'est simple et complexe, ça a été inventé à l'époque des ordi qui avaient des petites mémoire ( zx81 1ko )
le token prenaient 1 octet en mémoire alors que la même instruction = autant de caractere = autant d'octet en moins pour le code...
pour le principe, je te conseille la page :
http://www.cix.co.uk/~rrussell/products ... nnexd.html
descend à "Program Storage in Memory"
voila de quoi t'occuper....
patrick