Interpreteur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Interpreteur

Message par SPH »

dayvid a écrit :Tien, SPH, je voudrait te demander un service stp
Oui monsieur :

Code : Tout sélectionner

code$="ça, c'est mon message [UneVariableNumerique] [UneVariableAlphaNumerique$] [#UneConstanteNumerique0] [#UneconstanteAlphaNumerique]"


x=FindString(code$,"[",1)
final$=Chr(34)+Mid(code$,1,x-1)+Chr(34)
y=FindString(code$,"]",x)
final$+" + Str("+Mid(code$,x+1,y-x-1)+") + "+Chr(34)+" "+Chr(34)+" + "

x=FindString(code$,"[",x+1)
y=FindString(code$,"]",x+1)
final$+Mid(code$,x+1,y-x-1)+" + "+Chr(34)+" "+Chr(34)

x=FindString(code$,"[",x+1)
y=FindString(code$,"]",x+1)
final$+" + Str("+Mid(code$,x+1,y-x-1-1)+") + "+Chr(34)+" "+Chr(34)+" + "

x=FindString(code$,"[",x+1)
y=FindString(code$,"]",x+1)
final$+Mid(code$,x+1,y-x-1)


Debug final$

;"ça, c'est mon message " + Str(UneVariableNumerique) + " " + UneVariableAlphaNumerique$ + " " + Str(#UneConstanteNumerique) + " " + #UneconstanteAlphaNumerique

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Interpreteur

Message par dayvid »

Ouoi, merci SPH, trop bien

t'es bien plus doué que moi :wink:

Bon j'ai pas réussi a trouvé le programme mais quand je reviend je te le montre
c'est un logiciel pour crée ces propre boitte de dialogue, tu verra

Bon sinon dans mon programme tu as deux entrée de texte, un pour le titre et l'autre pour le texte
imagine que tu entre ce code pour le titre ou le texte, comment je fait pour le convertire ?

exemple:

Code : Tout sélectionner

Un Texte + [UneVariableNumerique] + Un Autre Texte + [UneVariableAlphaNumerique$] + Un Autre Texte + [#UneConstanteNumerique0] + Un Autre Texte + [#UneConstanteAlphaNumerique] + Un Autre Texte
Un Texte + [UneVariableNumerique + UneVariableAlphaNumerique$] + Un Autre Texte + [#UneConstanteNumerique0 + UneVariableAlphaNumerique$]
Un Texte + [UneVariableNumerique + #UneConstanteNumerique0] + Un Autre Texte + [UneVariableAlphaNumerique$] + [#UneConstanteAlphaNumerique] + Un Autre Texte
Un Texte + [UneVariableNumerique + 5 * 2 - 10 / 3] + Un Autre Texte + [UneVariableAlphaNumerique$ - 10 * 2 / 25 + 300]
Un Texte + [#UneConstanteNumerique0 * 8 - 10 / 25 + 150] + Un Autre Texte + [#UneConstanteAlphaNumerique / 8 * 5 + 50 - UneVariableAlphaNumerique$] + Un Autre Texte
Un Texte + [50 / #UneConstanteNumerique0 + UneVariableAlphaNumerique$ * UneVariableNumerique - UneVariableAlphaNumerique$] + Un Autre Texte
apres réfléction, je pense que se serais plus simple d'inclure des " pour le texte car sa va évité
pas mal de souci inutile donc en faite sa donnerais plutôt ceci:

Code : Tout sélectionner

"Un Texte" + [UneVariableNumerique] + "Un Autre Texte" + [UneVariableAlphaNumerique$] + "Un Autre Texte" + [#UneConstanteNumerique0] + "Un Autre Texte" + [#UneConstanteAlphaNumerique] + "Un Autre Texte"
"Un Texte" + [UneVariableNumerique + UneVariableAlphaNumerique$] + "Un Autre Texte" + [#UneConstanteNumerique0 + UneVariableAlphaNumerique$]
"Un Texte" + [UneVariableNumerique + #UneConstanteNumerique0] + "Un Autre Texte" + [UneVariableAlphaNumerique$] + [#UneConstanteAlphaNumerique] + "Un Autre Texte"
"Un Texte" + [UneVariableNumerique + 5 * 2 - 10 / 3] + "Un Autre Texte" + [UneVariableAlphaNumerique$ - 10 * 2 / 25 + 300]
"Un Texte" + [#UneConstanteNumerique0 * 8 - 10 / 25 + 150] + "Un Autre Texte" + [#UneConstanteAlphaNumerique / 8 * 5 + 50 - UneVariableAlphaNumerique$] + "Un Autre Texte"
"Un Texte" + [50 / #UneConstanteNumerique0 + UneVariableAlphaNumerique$ * UneVariableNumerique - UneVariableAlphaNumerique$] + "Un Autre Texte"
Pour différencier une constante texte d'une constante nombre, je met le chiffre 0 a la fin de la constante nombre
mais attention car ce chiffre ne devra pas être visible une fois le code convertie !

A oui mais problème, l'utilisateur doit aussi pouvoir entrer des guillemet s'il le souhaite ou n'importe qu'elle autre caractère
et là ça va poser un gros soucis pour gérer ça, a moins d'utiliser une combinaison de caractère pour représenter une chaine de caractère
ou sinon on dit au programme de ne prendre que le premier et le dernier guillemet de la chaine en compte, je pense que sa marcherais comme ça

Il faut aussi pensser a vérrifier les noms de variable et constante, mais ça c'est bon pour moi
il faut extraire le nom de c'elle-ci et la vérrifier, c'est pas un problème

C'est pour la conversion ou je rame beaucoup

Ce qui donnerais donc a la conversion si je me trompe pas:

Code : Tout sélectionner

"Un Texte" + Str(UneVariableNumerique) + "Un Autre Texte" + UneVariableAlphaNumerique$ + "Un Autre Texte" + Str(#UneConstanteNumerique) + "Un Autre Texte" + #UneConstanteAlphaNumerique + "Un Autre Texte"
"Un Texte" + Str(UneVariableNumerique + Val(UneVariableAlphaNumerique$)) + "Un Autre Texte" + Str(#UneConstanteNumerique + Val(UneVariableAlphaNumerique$))
"Un Texte" + Str(UneVariableNumerique + #UneConstanteNumerique) + "Un Autre Texte" + UneVariableAlphaNumerique$ + #UneConstanteAlphaNumerique + "Un Autre Texte"
"Un Texte" + Str(UneVariableNumerique + 5 * 2 - 10 / 3) + "Un Autre Texte" + Str(Val(UneVariableAlphaNumerique$) - 10 * 2 / 25 + 300)
"Un Texte" + Str(#UneConstanteNumerique * 8 - 10 / 25 + 150) + "Un Autre Texte" + Str(Val(#UneConstanteAlphaNumerique) / 8 * 5 + 50 - Val(UneVariableAlphaNumerique$)) + "Un Autre Texte"
"Un Texte" + Str(50 / #UneConstanteNumerique + Val(UneVariableAlphaNumerique$) * UneVariableNumerique - Val(UneVariableAlphaNumerique$)) + "Un Autre Texte"
C'est un truc de malade 8O

SPH, je vais étudier ton code et essayer de me débrouillé mais sa m'étonnerais que j'y arrive !
mais je vais essayer quand même, tu peut a ta guise si tu le souhaite essayer de ton coté aussi

En plus tu voie sa va m'entrainer un peut pour le programme de programmation
mais là, ça n'as rien a voir avec ça car c'est pour mon logiciel de création de boite de dialogue
mais déjà ça pourra surement servir pour la suite

Merci a toi, a bientôt :D
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Interpreteur

Message par SPH »

De rien, du moment que ca te fait avancer :mrgreen:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Interpreteur

Message par dayvid »

Tu te r'appel (ou pas) car je les pas retrouvé mais a l'époque j'avais mis
une de mes création, un logiciel de création de boitte de dialogue

le problème est que j'avais il me semble incorporer les compilateur
et le on ma carement insendier sur place :twisted:

Bref, je suis en train de l'améliorer mais j'ai du boulot
mais j'y arriverais, voici une capture (pas fini)

Image
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Interpreteur

Message par SPH »

Non je ne me rapelle pas de tes debuts en PB. Va au bout de tes reves, ca peux donner quelque chose :P

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Interpreteur

Message par dayvid »

Ba toi au moin tu t'interesse a ce que je fait, c'est déjà pas si mal :)
la je suis en plein déménagement alors je vais y aller molo :mrgreen:
au faite, regarde mes fichier que je t'es donner (sur le site)
ya quand même des bon programme, notament les logiciel de création de boite de dialogue !
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Interpreteur

Message par Ollivier »

Salut!

Au passage, je poste cet en-tête de code (ou include):

Code : Tout sélectionner

;{ Head }
      ;{ Globals }
Global.I CplHnd
Global.S ExecFile
Global.S SourceFile
Global NewList Lst.S() 
Global Dim Fc.S(0)
Global.I FcQty
      ;}
      ;{ Procedures }
Procedure.I WPSN(S.S)
      Protected.I Result
      Result = WriteProgramStringN(CplHnd, S)
      Delay(1)
      ProcedureReturn Result
EndProcedure
Procedure.S RPS()
      Protected Result.S
      Result = ReadProgramString(CplHnd)
      Delay(1)
      ProcedureReturn Result
EndProcedure
Procedure OpenCompiler()
      CplHnd = RunProgram("PbCompiler.EXE", "/STANDBY", #PB_Compiler_Home + "\Compilers", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Hide)
      Delay(1)
      a$ = RPS()
      a$ = RPS()
EndProcedure
Procedure CloseCompiler()
      n = WPSN("end")
EndProcedure
Procedure ExecSource()
      Delay(500)
      OpenCompiler(): Delay(1)
      WPSN("SOURCE" + Chr(9) + SourceFile)
      WPSN("TARGET" + Chr(9) + ExecFile)
      WPSN("COMPILE")
      CloseCompiler(): Delay(1)
      RunProgram(ExecFile)
EndProcedure
Procedure GetCommandList()
      Delay(500)
      OpenCompiler(): Delay(1)
      WPSN("FUNCTIONLIST")
      FcQty = Val(RPS() )
      Global Dim Fc.S(FcQty)
      For i = 1 To FcQty
            Fc(i) = RPS()
      Next
      CloseCompiler(): Delay(1)
EndProcedure
Procedure WSN(S.S)
      WriteStringN(0, S)
      Delay(1)
EndProcedure
Procedure CompileSource()
      ExecFile = #PB_Compiler_Home + "SOURCE.EXE"
      SourceFile = #PB_Compiler_Home + "SOURCE.PB"
      DeleteFile(ExecFile)
      Delay(1)
      DeleteFile(SourceFile)
      Delay(1)
      CreateFile(0, SourceFile)
      Delay(1)
      ForEach(Lst() )
            WSN(Lst() )
      Next
      CloseFile(0)
      ExecSource()
EndProcedure
Procedure AddLst(SourceLine.S)
      AddElement(Lst() ): Lst() = SourceLine
EndProcedure
Procedure.S Gm(S.S)
      ProcedureReturn Chr(34) + S + Chr(34)
EndProcedure
      ;}
;}
Après, il y a juste à comprendre que "Message" s'écrira Gm("Message") (Gm = Guillemets) et l'on utilise une liste en tant que programme à compiler. Voici un exemple:

Code : Tout sélectionner

AddLst("MessageRequester(" + Gm("Un titre") + ", " + Gm("Un message") + ")")
AddLst("End")

CompileSource()
End
Voilà, je trouvais judicieux de vous montrer le truc tellement c'est simple. Le compilateur fait alors office de très bon filet pour créer son interpréteur. Avec la fonction GetCommandList(), l'inventaire de toutes les fonctions du langages se retrouve stocké dans une liste, et tout, et tout...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Interpreteur

Message par Backup »

Voilà, je trouvais judicieux de vous montrer le truc tellement c'est simple. Le compilateur fait alors office de très bon filet pour créer son interpréteur.

ce que tu propose n'est pas un interpreteur ... :)

ce que tu propose ( et qui reste tres intéressant ) c'est la façon dont procède un
éditeur comme Japbe, ou l'editeur officiel , pour "envoyer" le code Purebasic
au compilateur .. :)

un interpréteur, c'est pas ça :)

un interpréteur , c'est un prg qui va lire les lignes d'un listing , contenant un langage X
et "interpréter" (traduire) ces lignes de "codes", pour faire des actions !

un interpréteur , peut ou pas utiliser des variables, des boucles ,
il utilise dans tout les cas des "ordres" , qui seront traduit en action...

en général , il gère une ou plusieurs zone mémoire, qui lui permettent de mémoriser
les actions , ou le résultat de ces actions

et gere un pointeur , qui permet de savoir ou il se trouve dans le listing en cours d'exécution , il reproduit en cela, le comportement du pointeur de prg (PC) , bien connu en assembleur...

sans ce minimum , on n'as pas a faire a un interpréteur... :)

je tiens a préciser ce fait, pour ne pas induire en erreur certains lecteurs
Répondre