Page 1 sur 1

PB_Eval()

Publié : mar. 07/mars/2017 18:17
par Shadow
Salut, j’essaie de créer une fonction simple mais puissante pour évaluer
une expression texte grâce au compilateur, pas si simple en faite !

Niveau évaluation ça va je gère je crois, le truc c'est
comment faire ça le mieux possible ?...

Là ou sa devient plus compliqué, c'est si ont inclue dans l'expression
des (Variables ça gère car pas besoin de les déclarer)
Listes, Tableaux, Maps voir des fonctions perso.

Il faut les déclarer avant l'expression, ça
je gère aussi plus ou moins je pense.

Bon, pour commencer, avec ce bout de code (Variables non encore implémenté mais j'y travail)
Est-ce la meilleur façon de procédé ?
Est-ce bien structurer, etc ?
Est-ce que le code est propre ?

Une fois ce bout de code propre et avec vos conseil je passerais à la suite.

Expression.s = Expression sous forme de texte, ex: "123.369 * (45 / 12 - 5) + Val(" + chr(34) + "47" + chr(34) + ")"
Variables.s = Toutes les Variables, Listes, Tableaux, Maps... Pas encore ajouté
Format.s = Format de sortie pour savoir comment évaluer l'expression, en tans que Nombre, String, Script
Type.s = C'est le type pour certain Format

Édit: Code plusieurs fois édité et corrigé.

Merci.

Code : Tout sélectionner

; Evaluateur d'expression grâce au Compilateur.
; PB_Eval()

; Créer par Monsieur Dieppedalle David le 06/03/2017.

Structure PB_Eval
  
  PB_Eval_Expression.s
  PB_Eval_Variables.s
  PB_Eval_Format.s
  PB_Eval_Type.s
  PB_Eval_Erreur.s
  PB_Eval_Resultat.s
  
EndStructure

Global PB_Eval.PB_Eval

Procedure.b PB_Eval(PB_Eval_Expression.s = "", PB_Eval_Variables.s = "", PB_Eval_Format.s = "PB_Eval_Str", PB_Eval_Type.s = "PB_Eval_Quad")
  
  PB_Eval.PB_Eval\PB_Eval_Expression = PB_Eval_Expression.s
  PB_Eval.PB_Eval\PB_Eval_Variables = PB_Eval_Variables.s
  PB_Eval.PB_Eval\PB_Eval_Format = PB_Eval_Format.s
  PB_Eval.PB_Eval\PB_Eval_Type = PB_Eval_Type.s
  
  PB_Eval.PB_Eval\PB_Eval_Erreur = ""
  PB_Eval.PB_Eval\PB_Eval_Resultat = ""
  
  Select LCase(PB_Eval_Type.s)
      
    Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
      PB_Eval_Type.s = ReplaceString(PB_Eval_Type.s, "PB_Eval", "#PB", #PB_String_NoCase)
      
    Case "pb_eval_script_string", "pb_eval_script_nombre"
      
    Default
      PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide: " + PB_Eval_Type.s + "."
      ProcedureReturn 0
      
  EndSelect
  
  If PB_Eval_Expression.s <> ""
    
    CreateDirectory(GetCurrentDirectory() + "Compilation") 
    SetCurrentDirectory(GetCurrentDirectory() + "Compilation")
    
    If CreateFile(1, GetCurrentDirectory() + "PB_Eval_CodeSource.pb")
      
      Select LCase(PB_Eval_Format.s)
          
        Case "pb_eval_str", ""
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Str(" + PB_Eval_Expression.s + ")): CloseFile(1)")
          
        Case "pb_eval_stru"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
              
            Default
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, StrU(" + PB_Eval_Expression.s + ", " + PB_Eval_Type.s + ")): CloseFile(1)")
          
        Case "pb_eval_strf"
          
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, StrF(" + PB_Eval_Expression.s + ")): CloseFile(1)")
          
        Case "pb_eval_strd"
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, StrD(" + PB_Eval_Expression.s + ")): CloseFile(1)")
          
        Case "pb_eval_hex"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
              
            Default
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Hex(" + PB_Eval_Expression.s + ", " + PB_Eval_Type.s + ")): CloseFile(1)")
          
        Case "pb_eval_bin"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
              
            Default
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Bin(" + PB_Eval_Expression.s + ", " + PB_Eval_Type.s + ")): CloseFile(1)")
          
        Case "pb_eval_string"
          WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, " + Chr(34) + ReplaceString(PB_Eval_Expression.s, Chr(34), Chr(34) + "+ Chr(34) +" + Chr(34)) + Chr(34) + "): CloseFile(1)")
          
        Case "pb_eval_script"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_script_string"
              WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, " + PB_Eval_Expression.s + "): CloseFile(1)")
              
            Case "pb_eval_script_nombre"
              WriteString(1, CodeVariable.s + ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Str(" + PB_Eval_Expression.s + ")): CloseFile(1)")
              
            Default
              
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
        Default
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Format Invalide: " + PB_Eval_Format.s + "."
          CloseFile(1)
          ProcedureReturn 0
          
      EndSelect
      
      CloseFile(1)
      
    Else
      PB_Eval.PB_Eval\PB_Eval_Erreur = "Impossible d'écrire le code source !"
      ProcedureReturn 0
      
    EndIf
    
    Delay(25) ; Histoire de laisser souffler un peu le fichier.
    
    PB_Eval_Compilateur = RunProgram(#PB_Compiler_Home + "/Compilers/pbcompiler", "PB_Eval_CodeSource.pb", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    
    PB_Eval_Sortie.s = ""
    PB_Eval_Erreur.s = ""
    
    If PB_Eval_Compilateur
      
      While ProgramRunning(PB_Eval_Compilateur)
        
        If AvailableProgramOutput(PB_Eval_Compilateur)
          
          PB_Eval_Sortie.s = ReadProgramString(PB_Eval_Compilateur)
          
          If FindString(PB_Eval_Sortie.s, "Line")
            PB_Eval_Erreur.s = PB_Eval_Sortie.s + Chr(13)
            
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "is Not a valid operator", "n'est pas un opérateur valide", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Not a valid Decimal number", "Ceci n'est pas un nombre décimal valide", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Syntax error", "Erreur de syntaxe", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Bad parameter type: a string is expected", "Type de paramètre incorrect: une chaîne est attendue", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Bad parameter type, number expected instead of string", "Type de paramètre incorrect: un nombre est attendu au lieu d'une chaîne", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Literal string Not terminated (" + Chr(34) + " missing)", "Une chaîne n'est pas terminé: il manque un guillemet", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "A variable can't be named the same as a keyword", "Une variable ne peut pas être nommée comme un mot-clé", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Comparisons (=, <, >, =< And >=) are only supported With keywords like If, While, Until Or within Bool", "Les comparaisons (=, <,>, = <And> =) ne sont prises en charge qu'avec des mots clés comme: If, While, Until ou Bool", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Division by 0 forbidden", "Division par 0 interdite", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Numerical overflow: too many digits", "Débordement numérique: trop de chiffres", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "is Not a function, Array, List, Map Or Macro", "Cette Fonction est inconnue, ce n'est ni: Une Fonction, Un Tableau, Une Liste, Une Map ou une Macro", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Can't mix strings with numerical values.", "Impossible de mélanger des chaînes avec des valeurs numériques.", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Structure Not found", "Structure introuvable", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "The Array dimensions value needs To be between 1 And 255 For", "La valeur des dimensions Array doit être comprise entre 1 et 255 pour", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Error: line 1", "", #PB_String_NoCase)
            
            PB_Eval.PB_Eval\PB_Eval_Erreur = PB_Eval_Erreur.s
            ProcedureReturn 0
            
          EndIf
          
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Ok."
          
        EndIf
        
      Wend
      
      PB_Eval_ExitCode = ProgramExitCode(PB_Eval_Compilateur)
      CloseProgram(PB_Eval_Compilateur) ; Ferme la connection vers le programme
      
      If Bool(Not PB_Eval_ExitCode) ; Not, inversion de valeur, 0 = 1 et 1 = 0. 0 = pas d'erreurs, 1 = erreurs
        
        If ReadFile(1, GetCurrentDirectory() + "PB_Eval_Resultat.txt")
          
          While Eof(1) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
            PB_Eval_Resultat.s + ReadString(1) ; Affiche du fichier
          Wend
          
          CloseFile(1)
          
          PB_Eval.PB_Eval\PB_Eval_Resultat = PB_Eval_Resultat.s
          
        Else
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Le résultat n'est pas disponnible."
          ProcedureReturn 0
          
        EndIf
        
      Else
        PB_Eval.PB_Eval\PB_Eval_Erreur = "Une erreur de compilation c'est produite."
        ProcedureReturn 0
        
      EndIf
      
    Else
      PB_Eval.PB_Eval\PB_Eval_Erreur = "Le Compilateur est Introuvable."
      ProcedureReturn 0
      
    EndIf
    
  EndIf
  
  ProcedureReturn 1
  
EndProcedure

Procedure.s PB_Eval_Get_Expression()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Expression
EndProcedure

Procedure.s PB_Eval_Get_Variables()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Variables
EndProcedure

Procedure.s PB_Eval_Get_Format()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Format
EndProcedure

Procedure.s PB_Eval_Get_Type()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Type
EndProcedure

Procedure.s PB_Eval_Get_Erreur()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Erreur
EndProcedure

Procedure.s PB_Eval_Get_Resultat()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Resultat
EndProcedure

Expression.s = "98/4*89/4.25"

Variables.s = ""

; pb_eval_str
; pb_eval_stru
; pb_eval_strf
; pb_eval_strd
; pb_eval_hex
; pb_eval_bin
; pb_eval_string
; pb_eval_script
Format.s = "pb_eval_str"

; pb_eval_quad
; pb_eval_byte
; pb_eval_ascii
; pb_eval_word
; pb_eval_unicode
; pb_eval_long
; pb_eval_script_string
; pb_eval_script_nombre
Type.s = "pb_eval_quad"

PB_Eval(Expression.s, Variables.s, Format.s, Type.s)

Debug "Expression Entré: " + PB_Eval_Get_Expression()
Debug "Variables Entré: " + PB_Eval_Get_Variables()
Debug "Format Entré: " + PB_Eval_Get_Format()
Debug "Type Entré: " + PB_Eval_Get_Type()
Debug "Erreur Rencontré: " + PB_Eval_Get_Erreur()
Debug "Résultat de l'expression: " + PB_Eval_Get_Resultat()

Re: PB_Eval()

Publié : mar. 07/mars/2017 21:59
par falsam
Un code de utopiomania qui fait bien et même trés bien le job http://forums.purebasic.com/english/vie ... hp?t=15762

Re: PB_Eval()

Publié : mar. 07/mars/2017 22:10
par Shadow
Ah oui je vois, merci.
Cependant trop limité et sans debuger !

J'aspire a mieux :)

Re: PB_Eval()

Publié : mar. 07/mars/2017 22:13
par falsam
Shadow a écrit :Cependant trop limité et sans debuger !
trop limité ?
Shadow a écrit :sans debuger !
Facile à ajouter je pense
Shadow a écrit :J'aspire a mieux
Par exemple pour résoudre quoi ?

Re: PB_Eval()

Publié : mar. 07/mars/2017 22:46
par Shadow
Comme pour mon editeur d'expression mais sans interface voilà :)

Re: PB_Eval()

Publié : mer. 08/mars/2017 14:08
par Kwai chang caine
Bah moi..... j'eusse aspiré à un résultat :|
L'évaluateur de la mort a écrit :Expression Entré: 98/4*89/4.25
Variables Entré:
Format Entré: pb_eval_str
Type Entré: pb_eval_quad
Erreur Rencontré: Le résultat n'est pas disponnible.
Résultat de l'expression:
W7 X86 Pb5.60

Re: PB_Eval()

Publié : mer. 08/mars/2017 14:17
par falsam
Kwai chang caine a écrit :Bah moi..... j'eusse aspiré à un résultat

Code : Tout sélectionner

Debug 98/4*89/4.25


Image

Re: PB_Eval()

Publié : mer. 08/mars/2017 16:37
par ChrisR
falsam a écrit :Un code de utopiomania qui fait bien et même trés bien le job http://forums.purebasic.com/english/vie ... hp?t=15762
Et avec une très jolie écriture récursive du code :wink:

Re: PB_Eval()

Publié : mer. 08/mars/2017 18:48
par Shadow
Rho le vilain programme qui ne veux pas marcher avec Kwai chang caine :|
Je vais remédier à ceci immédiatement, non mais, pas un programme qui va faire ça loi ici !

Édit: Soucis avec le fichier: PB_Eval_Resultat.txt
Si il porte bien ce nom là...

Sinon supprime le dossier Compilation si il existe ou les fichier généré par la compilation...

Re: PB_Eval()

Publié : sam. 11/mars/2017 10:09
par Shadow
Voici la suite, possibilité de créer et utiliser des Variables.
Normalement tous devrais fonctionné:

Édit: Petites corrections.
Édit: Ajout d'une Option, Petites corrections.

Code : Tout sélectionner

; Evaluateur d'expressions grâce au Compilateur.
; PB_Eval()

; Créer par Monsieur Dieppedalle David le 06/03/2017.

;{ Gestion des erreurs:
Declare ErrorFatal()
OnErrorCall(@ErrorFatal())
;}

;{ Structures:
Structure PB_Eval
  
  PB_Eval_Expression.s
  PB_Eval_Format.s
  PB_Eval_Type.s
  PB_Eval_Erreur.s
  PB_Eval_Resultat.s
  PB_Eval_Option.b
  
EndStructure

Structure PB_Eval_Variable
  
  PB_Eval_Variable_Nom.s
  PB_Eval_Variable_Type.s
  PB_Eval_Variable_Extension.s
  PB_Eval_Variable_LimiteTaille.i
  PB_Eval_Variable_NombreDimension.a
  PB_Eval_Variable_TaillesDimensions.s
  PB_Eval_Variable_TailleSlot.i
  
EndStructure
;}

;{ Variables:
Global PB_Eval.PB_Eval
Global Dim PB_Eval_Variable.PB_Eval_Variable(999)
Global NewList PB_Eval_Liste_Variable.s()
Global NewList PB_Eval_Liste_Code_Variable.s()
;}

;{ Procedures:
; Procedure en cas d'erreur fatal du programme.
Procedure ErrorFatal()
  
  Select ErrorCode()
      
    Case #PB_OnError_InvalidMemory ; Lecture ou écriture dans une zone mémoire protègée.
      MessageErreur$ = "Lecture ou écriture dans une zone mémoire protègée."
      
    Case #PB_OnError_Floatingpoint ; Erreur de calcul flottant.
      MessageErreur$ = "Erreur de calcul flottant."
      
    Case #PB_OnError_Breakpoint ; Point d'arrêt débogueur atteint (autres que ceux du PureBasic.)
      MessageErreur$ = "Point d'arrêt du débogueur atteint."
      
    Case #PB_OnError_IllegalInstruction ; Exécution d'une instruction invalide.
      MessageErreur$ = "Instruction rencontrée invalide."
      
    Case #PB_OnError_PriviledgedInstruction ; Ex�cution d'une instruction privilègiée (system) non autorisée.
      MessageErreur$ = "Instruction rencontrée privilègiée system non autorisée."
      
    Case #PB_OnError_DivideByZero ; Division par zéro (Windows seulement).
      MessageErreur$ = "Division par zéro."
      
  EndSelect
  
  MessageRequester("Erreur critique", "      Le programme a rencontré un problème et doit fermer !" + #CRLF$ + "      Imformation sur l'erreur: " + #CRLF$ + #CRLF$ + "      " + MessageErreur$, 16)
  
EndProcedure

; Procedure pour évaluer un code.
Procedure.b PB_Eval(PB_Eval_Expression.s = "", PB_Eval_Format.s = "PB_Eval_Str", PB_Eval_Type.s = "PB_Eval_Quad", PB_Eval_Check.b = #False)
  
  PB_Eval.PB_Eval\PB_Eval_Expression = PB_Eval_Expression.s
  PB_Eval.PB_Eval\PB_Eval_Format = PB_Eval_Format.s
  PB_Eval.PB_Eval\PB_Eval_Type = PB_Eval_Type.s
  PB_Eval.PB_Eval\PB_Eval_Option = PB_Eval_Check.b
  
  PB_Eval.PB_Eval\PB_Eval_Erreur = ""
  PB_Eval.PB_Eval\PB_Eval_Resultat = ""
  
  Select LCase(PB_Eval_Type.s)
      
    Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
      PB_Eval_Type.s = ReplaceString(PB_Eval_Type.s, "PB_Eval", "#PB", #PB_String_NoCase)
      
    Case "pb_eval_script_string", "pb_eval_script_nombre"
      
    Default
      PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide: " + PB_Eval_Type.s + "."
      ProcedureReturn 0
      
  EndSelect
  
  If PB_Eval_Expression.s <> ""
    
    CreateDirectory(GetCurrentDirectory() + "Compilation") 
    SetCurrentDirectory(GetCurrentDirectory() + "Compilation")
    
    If CreateFile(1, GetCurrentDirectory() + "PB_Eval_CodeSource.pb")
      
      WriteString(1, "EnableExplicit: ")
      
      ForEach PB_Eval_Liste_Code_Variable.s()
        WriteStringN(1, PB_Eval_Liste_Code_Variable.s())
      Next
      
      Select LCase(PB_Eval_Format.s)
          
        Case "pb_eval_str", ""
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Str(" + PB_Eval_Expression.s + ")): CloseFile(1)")
          
        Case "pb_eval_stru"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
              
            Default
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, StrU(" + PB_Eval_Expression.s + ", " + PB_Eval_Type.s + ")): CloseFile(1)")
          
        Case "pb_eval_strf"
          
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, StrF(" + PB_Eval_Expression.s + ")): CloseFile(1)")
          
        Case "pb_eval_strd"
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, StrD(" + PB_Eval_Expression.s + ")): CloseFile(1)")
          
        Case "pb_eval_hex"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
              
            Default
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Hex(" + PB_Eval_Expression.s + ", " + PB_Eval_Type.s + ")): CloseFile(1)")
          
        Case "pb_eval_bin"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_quad", "pb_eval_byte", "pb_eval_ascii", "pb_eval_word", "pb_eval_unicode", "pb_eval_long"
              
            Default
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Bin(" + PB_Eval_Expression.s + ", " + PB_Eval_Type.s + ")): CloseFile(1)")
          
        Case "pb_eval_string"
          WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, " + ~"ReplaceString(PB_Eval_Expression.s, \", \"): CloseFile(1)")
          
        Case "pb_eval_script"
          
          Select LCase(PB_Eval_Type.s)
              
            Case "pb_eval_script_string"
              WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, " + PB_Eval_Expression.s + "): CloseFile(1)")
              
            Case "pb_eval_script_nombre"
              WriteString(1, ~"CreateFile(1, GetCurrentDirectory() + \"PB_Eval_Resultat.txt\"): WriteString(1, Str(" + PB_Eval_Expression.s + ")): CloseFile(1)")
              
            Default
              
              PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Type Invalide pour ce format: " + PB_Eval_Format.s + "."
              CloseFile(1)
              ProcedureReturn 0
              
          EndSelect
          
        Default
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Paramètre PB_Eval_Format Invalide: " + PB_Eval_Format.s + "."
          CloseFile(1)
          ProcedureReturn 0
          
      EndSelect
      
      CloseFile(1)
      
    Else
      PB_Eval.PB_Eval\PB_Eval_Erreur = "Impossible d'écrire le code source !"
      ProcedureReturn 0
      
    EndIf
    
    If PB_Eval_Check.b = #False
      PB_Eval_Compilateur = RunProgram(#PB_Compiler_Home + "/Compilers/pbcompiler", "PB_Eval_CodeSource.pb", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    ElseIf PB_Eval_Check.b = #True
      PB_Eval_Compilateur = RunProgram(#PB_Compiler_Home + "/Compilers/pbcompiler", "PB_Eval_CodeSource.pb -k", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    EndIf
    
    PB_Eval_Sortie.s = ""
    PB_Eval_Erreur.s = ""
    
    If PB_Eval_Compilateur
      
      While ProgramRunning(PB_Eval_Compilateur)
        
        If AvailableProgramOutput(PB_Eval_Compilateur)
          
          PB_Eval_Sortie.s = ReadProgramString(PB_Eval_Compilateur)
          
          If FindString(PB_Eval_Sortie.s, "Line")
            PB_Eval_Erreur.s = PB_Eval_Sortie.s + #CRLF$
            
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "is Not a valid operator", "n'est pas un opérateur valide", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Not a valid Decimal number", "Ceci n'est pas un nombre décimal valide", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Syntax error", "Erreur de syntaxe", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Bad parameter type: a string is expected", "Type de paramètre incorrect: une chaîne est attendue", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Bad parameter type, number expected instead of string", "Type de paramètre incorrect: un nombre est attendu au lieu d'une chaîne", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, ~"Literal string Not terminated (\"missing\")", "Une chaîne n'est pas terminée: il manque un guillemet", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "A Variable can't be named the same as a keyword", "Une Variable ne peut pas être nommée comme un mot-clé", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Comparisons (=, <, >, =< And >=) are only supported With keywords like If, While, Until Or within Bool", "Les comparaisons (=, <,>, = <And> =) ne sont prises en charge qu'avec des mots clés comme: If, While, Until ou Bool", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Division by 0 forbidden", "Division par 0 interdite", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Numerical overflow: too many digits", "Débordement numérique: trop de chiffres", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "is Not a function, Array, List, Map Or Macro", "Cette expression est inconnue, ce n'est ni: Une Fonction, Un Tableau, Une Liste, Une Map ou une Macro", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Can't mix strings with numerical values.", "Impossible de mélanger des chaînes avec des valeurs numériques.", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Structure Not found", "Structure introuvable", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "The Array dimensions value needs To be between 1 And 255 For", "Nombre de dimensions du Tableau non valide, Le nombre de dimensions du tableau doit être compris entre 1 et 255 pour", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Garbage at the End of the line", "Erreur à la fin de la ligne", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "A string expression is expected ('number' Not allowed)", "Une chaîne est attendue, Nombre non autorisé.", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Constant Not found", "Constante non trouvé", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "With 'EnableExplicit', variables have To be declared", "Variable non déclarée", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Array type is different than earlier", "L'Extension d'une Variable de Type Tableau n'est pas la même que lors de sa déclaration", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Variable already declared With another type", "Cette Variable est déjà déclarée avec une Extension différente", #PB_String_NoCase)
            
            If FindString(PB_Eval_Erreur.s, "Error: Line ")
              LigneErreur.i = Val(Mid(PB_Eval_Erreur.s, 12, FindString(PB_Eval_Erreur.s, "-") - FindString(PB_Eval_Erreur.s, "Error: line ")))
              
              If LigneErreur.i <= ListSize(PB_Eval_Liste_Code_Variable.s())
                PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Error: line", "Erreur avec la Variable", #PB_String_NoCase)
              Else
                PB_Eval_Erreur.s = "Erreur dans l'expression -" + StringField(PB_Eval_Erreur.s, 2, "-")
              EndIf

            EndIf

            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, "Negative values are Not allowed", "Les valeurs négatives ne sont pas autorisées", #PB_String_NoCase)
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, #CRLF$, "")
            PB_Eval_Erreur.s = ReplaceString(PB_Eval_Erreur.s, Chr(10), "")
            
            PB_Eval.PB_Eval\PB_Eval_Erreur = PB_Eval_Erreur.s
            ProcedureReturn 0
            
          EndIf
          
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Ok."
          
        EndIf
        
      Wend
      
      PB_Eval_ExitCode = ProgramExitCode(PB_Eval_Compilateur)
      CloseProgram(PB_Eval_Compilateur) ; Ferme la connection vers le programme
      
      If Bool(Not PB_Eval_ExitCode) ; Not, inversion de valeur, 0 = 1 et 1 = 0. 0 = pas d'erreur, 1 = erreurs
        
        If ReadFile(1, GetCurrentDirectory() + "PB_Eval_Resultat.txt")
          
          While Eof(1) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
            PB_Eval_Resultat.s + ReadString(1) ; Affiche du fichier
          Wend
          
          CloseFile(1)
          
          DeleteFile(GetCurrentDirectory() + "PB_Eval_Resultat.txt")
          
          PB_Eval_Resultat.s = ReplaceString(PB_Eval_Resultat.s, "Infinity", "Infinité", #PB_String_NoCase)
          PB_Eval.PB_Eval\PB_Eval_Resultat = PB_Eval_Resultat.s
          
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Expression compilée et exécutée, pas d'erreur."
          
        ElseIf PB_Eval_Check.b = #True
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Expression vérifiée, pas d'erreur."
          ProcedureReturn 1
        Else
          PB_Eval.PB_Eval\PB_Eval_Erreur = "Une erreur de compilation s'est produite, Vérifiez l'Expression."
          ProcedureReturn 0
        EndIf
        
      Else
        PB_Eval.PB_Eval\PB_Eval_Erreur = "Une erreur de compilation s'est produite, erreur inconnue, Vérifiez l'Expression."
        ProcedureReturn 0
        
      EndIf
      
    Else
      PB_Eval.PB_Eval\PB_Eval_Erreur = "Le Compilateur est Introuvable."
      ProcedureReturn 0
      
    EndIf
    
  EndIf
  
  ProcedureReturn 1
  
EndProcedure

; Procedure qui renvoie l'Expression donnée avec la procedure PB_Eval().
Procedure.s PB_Eval_Get_Expression()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Expression
EndProcedure

; Procedure qui renvoie les Variables données avec la procedure PB_Eval().
Procedure.s PB_Eval_Get_Variables()
  
  PB_Eval_Liste_Variable.s = ""
  
  ForEach PB_Eval_Liste_Variable.s()
    If ListIndex(PB_Eval_Liste_Variable.s()) < ListSize(PB_Eval_Liste_Variable.s()) - 1
      PB_Eval_Liste_Variable.s + PB_Eval_Liste_Variable.s() + ", "
    Else
      PB_Eval_Liste_Variable.s + PB_Eval_Liste_Variable.s()
    EndIf
  Next
  
  ProcedureReturn PB_Eval_Liste_Variable.s
  
EndProcedure

; Procedure qui renvoie le Format donnée avec la procedure PB_Eval().
Procedure.s PB_Eval_Get_Format()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Format
EndProcedure

; Procedure qui renvoie le Type de Variable donnée avec la procedure PB_Eval().
Procedure.s PB_Eval_Get_Type()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Type
EndProcedure

; Procedure qui renvoie le message d'erreur de la procedure PB_Eval().
Procedure.s PB_Eval_Get_Erreur()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Erreur
EndProcedure

; Procedure qui renvoie le Résultat de l'Expression donnée avec la procedure PB_Eval().
Procedure.s PB_Eval_Get_Resultat()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Resultat
EndProcedure

; Procedure qui renvoie l'option de compilation avec la procedure PB_Eval().
Procedure.b PB_Eval_Get_Option()
  ProcedureReturn PB_Eval.PB_Eval\PB_Eval_Option
EndProcedure

; Procedure qui permet de crées des Variables pour l'utilisation avec la procedure PB_Eval().
Procedure PB_Eval_Set_Variable(NumeroID.i, Nom.s, Type.s, Extension.s, LimiteTaille.i, NombreDimension.a, TaillesDimensions.s, TailleSlot.i)
  
  ;{ Verification du Nom:
  
  If Nom.s <> ""
    
    For I = 1 To Len(Nom.s)
      
      Select Asc(Mid(Nom.s, I, 1))
          
        Case '0' To '9'
          
          If I = 1
            MessageRequester("Erreur Nom de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Le Nom d'une Variable ne peut pas commencer par un chiffre !", #PB_MessageRequester_Warning)
            End
            
          EndIf
          
        Case 'a' To 'z', 'A' To 'Z', '_'
          
        Default
          MessageRequester("Erreur Nom de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Le Nom d'une Variable ne peut pas contenir: " + #CRLF$ + #CRLF$ + "    - De caractères spéciaux (é, à, ß, ä, ö, ü, Etc.)" + #CRLF$ + "    - d'opérateur (+, -, *, /, Etc.), Ni d'espace !" , #PB_MessageRequester_Warning)
          End
          
      EndSelect
      
    Next
    
  Else
    MessageRequester("Erreur Nom de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Le Nom d'une Variable ne peut pas être vide !", #PB_MessageRequester_Warning)
    End
  EndIf
  
  ;}
  
  ;{ Verification du Type:
  
  Select LCase(Type.s)
      
    Case "variable", "constante", "pointeur", "liste", "tableau", "map"
      
    Default
      MessageRequester("Erreur Type de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Type non valide !" + #CRLF$ + #CRLF$ + "    Le Type d'une Variable doit être" + #CRLF$ + "    un des Types suivants:" + #CRLF$ + #CRLF$ + "    - Variable" + #CRLF$ + "    - Constante" + #CRLF$ + "    - Pointeur" + #CRLF$ + "    - Liste" + #CRLF$ + "    - Tableau" + #CRLF$ + "    - Map", #PB_MessageRequester_Warning)
      End
      
  EndSelect
  
  ;}
  
  ;{ Verification de l'Extension:
  
  If LCase(Type.s) = "variable" Or LCase(Type.s) = "liste" Or LCase(Type.s) = "tableau" Or LCase(Type.s) = "map"
    
    Select LCase(Extension.s)
        
      Case "a", "b", "c", "d", "f", "i", "l", "q", "s", "$", "u", "w"
        
      Default
        MessageRequester("Erreur Extension de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Extension non valide !" + #CRLF$ + #CRLF$ + "    L'Extension d'une Variable doit être" + #CRLF$ + "    l'une des extensions suivantes:" + #CRLF$ + #CRLF$ + "    - A" + #CRLF$ + "    - B" + #CRLF$ + "    - C" + #CRLF$ + "    - D" + #CRLF$ + "    - F" + #CRLF$ + "    - I" + #CRLF$ + "    - L" + #CRLF$ + "    - Q" + #CRLF$ + "    - S" + #CRLF$ + "    - $" + #CRLF$ + "    - U" + #CRLF$ + "    - W", #PB_MessageRequester_Warning)
        End
        
    EndSelect
    
  ElseIf LCase(Type.s) = "constante" Or LCase(Type.s) = "pointeur"
    
    If LCase(Extension.s) <> ""
      MessageRequester("Erreur Extension de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Extension non valide !" + #CRLF$ + #CRLF$ + "    Une Constante ou un Pointeur n'ont pas besoin d'extension !" + #CRLF$ + "    Enlevez l'extension, ce paramètre doit être vide.", #PB_MessageRequester_Warning)
      End
    EndIf
    
  Else
    MessageRequester("Erreur Type de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Type non valide !" + #CRLF$ + #CRLF$ + "    Le Type d'une Variable doit être" + #CRLF$ + "    un des Types suivants:" + #CRLF$ + #CRLF$ + "    - Variable" + #CRLF$ + "    - Constante" + #CRLF$ + "    - Pointeur" + #CRLF$ + "    - Liste" + #CRLF$ + "    - Tableau" + #CRLF$ + "    - Map", #PB_MessageRequester_Warning)
    End
    
  EndIf
  
  ;}
  
  ;{ Verification de la Limitte de Taille:
  
  If LimiteTaille.i <> 0
    
    If LCase(Type.s) = "variable" Or LCase(Type.s) = "liste" Or LCase(Type.s) = "tableau" Or LCase(Type.s) = "map"
      
      Select LCase(Extension.s)
          
        Case "s", "$"
          
          If LimiteTaille.i <= 0
            MessageRequester("Erreur Limite de Taille de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Limite de Taille non valide !" + #CRLF$ + #CRLF$ + "    La limite de taille d'une Variable doit être Supérieure à Zéro.", #PB_MessageRequester_Warning)
            End
            
          EndIf
          
        Default
          MessageRequester("Erreur Extension de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Extension non valide !" + #CRLF$ + #CRLF$ + "    L'Extension d'une Variable à Taille Fixe" + #CRLF$ + "    doit être une des Extensions suivantes: " + #CRLF$ + #CRLF$ + "    - S" + #CRLF$ + "    - $", #PB_MessageRequester_Warning)
          End
          
      EndSelect
      
    ElseIf LCase(Type.s) = "constante" Or LCase(Type.s) = "pointeur"
      MessageRequester("Erreur Limite de Taille de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Limite de Taille non valide !" + #CRLF$ + #CRLF$ + "    Une Constante ou un Pointeur ne peuvent" + #CRLF$ + "    pas avoir de Limite de Taille !" + #CRLF$ + #CRLF$ + "    Mettez le paramètre Limite de Taille à Zéro.", #PB_MessageRequester_Warning)
      End
      
    EndIf
    
  EndIf
  
  ;}
  
  ;{ Verification du Nombre de Dimension:
  
  If LCase(Type.s) = "tableau"
    
    If NombreDimension.a <= 0 Or NombreDimension.a > 255
      MessageRequester("Erreur Nombre de Dimension de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Nombre de Dimensions non valide !" + #CRLF$ + #CRLF$ + "    Le Nombre de Dimensions d'une Variable de Type Tableau" + #CRLF$ + "    doit être Supérieur à Zéro et inférieur ou égale à 255.", #PB_MessageRequester_Warning)
      End
      
    EndIf
    
  Else
    
    If NombreDimension.a <> 0
      MessageRequester("Erreur Nombre de Dimension de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Nombre de Dimensions non valide !" + #CRLF$ + #CRLF$ + "    Seule les Types de Variables: Tableaux, peuvent avoir des dimensions !" + #CRLF$ + "    Ce paramètre doit être mis à Zéro.", #PB_MessageRequester_Warning)
      End
      
    EndIf
    
  EndIf
  
  ;}
  
  ;{ Verification de la Taille des Dimensions:
  
  If LCase(Type.s) = "tableau"
    
    TaillesDimensions.s = UnescapeString(TaillesDimensions.s)
    TaillesDimensionsCopy.s = TaillesDimensions.s
    InterupteurChaine.b = #False
    TaillesDimensionsTableau.i = 1
    
    ; Determination du nombre de dimention dans la chaîne:
    If TaillesDimensions.s <> ""
      
      For I = 1 To Len(TaillesDimensions.s)
        
        CaractereAscii.a = Asc(Mid(TaillesDimensions.s, I, 1))
        
        Select CaractereAscii.a
            
          Case 34
            
            If InterupteurChaine.b = #False
              InterupteurChaine.b = #True
              
            ElseIf InterupteurChaine.b = #True
              TaillesDimensions.s = RemoveString(TaillesDimensions.s, Chr(CaractereAscii.a), #PB_String_NoCase, I, 1)
              InterupteurChaine.b = #False
              I - 1
              
            EndIf
            
        EndSelect
        
        If InterupteurChaine.b = #False
          
          If CaractereAscii.a = '|'
            TaillesDimensionsTableau.i + 1
          EndIf
          
        ElseIf InterupteurChaine.b = #True
          TaillesDimensions.s = RemoveString(TaillesDimensions.s, Chr(CaractereAscii.a), #PB_String_NoCase, I, 1)
          I - 1
          
        EndIf
        
      Next
      
      If NombreDimension.a < TaillesDimensionsTableau.i Or NombreDimension.a > TaillesDimensionsTableau.i
        MessageRequester("Erreur Taille de Dimensions de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Taille de Dimensions non valide !" + #CRLF$ + #CRLF$ + "    Vous devez spécifier la Taille de chaque Dimension entre des |." + #CRLF$ + #CRLF$ + "    Ce parametre doit avoir autant de champs de Taille de" + #CRLF$ + "    Dimension que le paramètre NombreDimension !", #PB_MessageRequester_Warning)
        End
      EndIf
      
    Else
      MessageRequester("Erreur Taille de Dimensions de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Taille de Dimensions non valide !" + #CRLF$ + #CRLF$ + "    Vous devez spécifier la Taille de chaque Dimension entre des |." + #CRLF$ + "    Ce parametre ne dois pas être vide !", #PB_MessageRequester_Warning)
      End
      
    EndIf
    
  Else
    
    If TaillesDimensions.s <> ""
      MessageRequester("Erreur Taille de Dimensions de Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Taille de Dimensions non valide !" + #CRLF$ + #CRLF$ + "    Seul les Types de Variables: Tableaux, peuvent" + #CRLF$ + "    avoir des Tailles de Dimensions !" + #CRLF$ + #CRLF$ + "    Ce paramètre doit être une chaîne vide.", #PB_MessageRequester_Warning)
      End
      
    EndIf
    
  EndIf
  
  ;}
  
  ;{ Verification de la Taille du Slot:
  
  If LCase(Type.s) = "map"
    
    If TailleSlot.i < 0
      MessageRequester("Erreur Taille Slot Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + "    Le paramètre Taille du Slot ne peut pas être négatif !", #PB_MessageRequester_Warning)
      End
    EndIf
    
  Else
    
    If TailleSlot.i <> 0
      MessageRequester("Erreur Taille Slot Variable...", "    Erreur avec la Variable Numéro: " + Str(NumeroID.i) + #CRLF$ + #CRLF$ + "    Le paramètre Taille du Slot n'est valable" + #CRLF$ + "    que pour le Type de Variable: Map !" + #CRLF$ + #CRLF$ + "    Ce paramètre doit être mis à Zéro.", #PB_MessageRequester_Warning)
      End
    EndIf
    
  EndIf
  
  ;}
  
  ;{ Verification de la Variable

  VariableTrouver.b = #False
  VariableOk.b = #False
  
  For I = 0 To ArraySize(PB_Eval_Variable.PB_Eval_Variable(), 1)
    
    ; On regarde d'abord si les deux Noms son différents:
    If LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Nom) = LCase(Nom.s)
      
      VariableTrouver.b = #True
      
      ; On a trouvé une autre Variable qui porte le même nom
      ; Maintenant on verifie si c'est une Liste, un Tableau ou une Map pour que le Nom ne soit pas pareil:
      Select LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Type)
          
        Case "liste", "tableau", "map"
          
          Select LCase(Type.s)
              
            Case "liste", "tableau", "map"
              
              Select LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Extension)
                  
                Case "a", "b", "c", "d", "f", "i", "l", "q", "s", "u", "w"
                  
                  Select LCase(Extension.s)
                      
                    Case "a", "b", "c", "d", "f", "i", "l", "q", "s", "u", "w"
                      ; Erreur ici
                      ; Deux Variables de même Type ne peuvent pas avoir le même Nom.
                      
                      MessageRequester("Erreur avec une Variable...", "    Erreur avec la Variable n°: " + Str(NumeroID) + #CRLF$ + #CRLF$ + "    Nom = " + Nom.s + #CRLF$ + "    Extension = " + Extension.s + #CRLF$ + "    Type = " + Type.s + #CRLF$ + #CRLF$ +
                                                                      "    Conflit avec la Variable n°: " + Str(I) + " !" + #CRLF$ + #CRLF$ + "    Nom = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Nom + #CRLF$ +
                                                                      "    Extension = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Extension + #CRLF$ + "    Type = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Type + #CRLF$ + #CRLF$ + 
                                                                      "    Deux Variables de Type Liste, Tableau ou Map ne " + #CRLF$ + "    peuvent pas porter le même Nom entre-eux !" + #CRLF$ + #CRLF$ + "    Sauf si l'une porte l'Extention $ et l'autre une de ces Extensions:" + #CRLF$ + "    A, B, C, D, F ,I, L, Q, S, U, W.", #PB_MessageRequester_Warning)
                      
                      End
                      
                  EndSelect
                  
                Case "$"
                  
                  If LCase(Extension.s) = "$"
                    MessageRequester("Erreur avec une Variable...", "    Erreur avec la Variable n°: " + Str(NumeroID) + #CRLF$ + #CRLF$ + "    Nom = " + Nom.s + #CRLF$ + "    Extension = " + Extension.s + #CRLF$ + "    Type = " + Type.s + #CRLF$ + #CRLF$ +
                                                                    "    Conflit avec la Variable n°: " + Str(I) + " !" + #CRLF$ + #CRLF$ + "    Nom = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Nom + #CRLF$ +
                                                                    "    Extension = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Extension + #CRLF$ + "    Type = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Type + #CRLF$ + #CRLF$ + 
                                                                    "    Deux Variables de Type Liste, Tableau ou Map ne " + #CRLF$ + "    peuvent pas porter le même Nom entre-eux !" + #CRLF$ + #CRLF$ + "    Sauf si l'une porte l'Extention $ et l'autre une de ces Extensions:" + #CRLF$ + "    A, B, C, D, F ,I, L, Q, S, U, W.", #PB_MessageRequester_Warning)
                    
                    End
                    
                  EndIf
                  
              EndSelect

          EndSelect
          
      EndSelect
      
      ; Il faut maintenant comparer les extensions:
      
      ; Les extension sont-elle différente ?:
      If LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Extension) <> LCase(Extension.s)
        
        ; Maintenant il faut comparer les Types:
        ; Si les Types sont identiques, il faut verifier que deux Variable de même Type d'Extension (.i, .f, .i, etc) ne porte pas le même Nom.
        ; Par exemple: Abc.i, Abc.s
        
        If LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Type) <> LCase(Type.s)
          ; Même Nom mais Extension et Type differente.
          ; Exemple: Variable Def.d, Pointeur Def ou Liste Def.i() ou Tableau Def.i(0) ou Map Def.i(0)
          VariableOk.b = #True

        EndIf
        
      ElseIf LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Extension) = LCase(Extension.s) ; Les extensions sont identiques !
        
        ; Maintenant il faut comparer les Types:
        If LCase(PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Type) <> LCase(Type.s)
          
          ; A priori pas d'erreur ici.
          ; Nom + Extention Pareille, mais type différent et pas de la même famille (Liste, Tableau et Map)
          ; Par exemple: Variable Abc.i, Liste Abc.i() ou Tableau Abc.i(0) ou Map Abc.i(0)
          
          VariableOk.b = #True
          
        Else ; Les Types sont identiques !
             ; Ici il y a un problème !
             ; Deux Variables ne peuvent pas avoir le même: Nom + Extention + Type
          
          MessageRequester("Erreur avec une Variable...", "    Erreur avec la Variable n°: " + Str(NumeroID) + #CRLF$ + #CRLF$ + "    Nom = " + Nom.s + #CRLF$ + "    Extension = " + Extension.s + #CRLF$ +
                                                          "    Type = " + Type.s + #CRLF$ + #CRLF$ + "    Conflit avec la Variable n°: " + Str(I) + " !" + #CRLF$ + #CRLF$ +
                                                          "    Nom = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Nom + #CRLF$ + "    Extension = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Extension + #CRLF$ +
                                                          "    Type = " + PB_Eval_Variable.PB_Eval_Variable(I)\PB_Eval_Variable_Type + #CRLF$ + #CRLF$ + "    Deux Variable ne peuvent pas: " + #CRLF$ + #CRLF$ +
                                                          "    - Porter le même Non" + #CRLF$ + "    - Avoir la même Extension" + #CRLF$ + "    - Avoir le même Type !", #PB_MessageRequester_Warning)
          End
          
        EndIf
        
      EndIf
      
    Else
      VariableOk.b = #True
      
    EndIf
    
  Next
  
  If VariableTrouver.b = #False Or VariableOk.b = #True
    
    ; Enregistrement de la Variable et tous ses paramètres:
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_Nom = Nom.s
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_Extension = Extension.s
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_Type = Type.s
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_LimiteTaille = LimiteTaille.i
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_NombreDimension = NombreDimension.a
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_TaillesDimensions = TaillesDimensions.s
    PB_Eval_Variable.PB_Eval_Variable(NumeroID)\PB_Eval_Variable_TailleSlot = TailleSlot.i
    
    CreationVariable$ = ""
    
    Select LCase(Type.s)
        
      Case "variable", "liste", "tableau", "map"
        
        If Extension.s <> "$"
          CreationVariable$ + Nom.s + "." + Extension.s
          
        ElseIf Extension.s = "$"
          CreationVariable$ + Nom.s + "$"
          
        EndIf
        
        If (Extension.s = "s" Or Extension.s = "$") And LimiteTaille > 0
          CreationVariable$ + "{" + Str(LimiteTaille) + "}"
          
        EndIf
        
        Select LCase(Type.s)
            
          Case "liste", "tableau", "map"
            CreationVariable$ + "("
            
        EndSelect
        
        Select LCase(Type.s)
            
          Case "liste"
            CreationVariable$ + ")"
            
          Case "tableau"
            
            If CountString(TaillesDimensions.s, "|") > 0
              
              For I = 1 To CountString(TaillesDimensions.s, "|") + 1
                
                If I < CountString(TaillesDimensions.s, "|") + 1
                  CreationVariable$ + StringField(TaillesDimensions.s, I, "|") + ", "
                  
                Else
                  CreationVariable$ + StringField(TaillesDimensions.s, I, "|")
                  
                EndIf
                
              Next
              
            Else
              CreationVariable$ + TaillesDimensions.s
              
            EndIf
            
            CreationVariable$ + ")"
            
          Case "map"
            
            If TailleSlot > 0
              CreationVariable$ + TailleSlot.i + ")"
              
            Else
              CreationVariable$ + ")"
              
            EndIf
            
        EndSelect
        
      Case "constante"
        
        CreationVariable$ + "#" + Nom.s
        
      Case "pointeur"
        CreationVariable$ + "*" + Nom.s
        
    EndSelect
    
    AddElement(PB_Eval_Liste_Variable.s())
    PB_Eval_Liste_Variable.s() = CreationVariable$
    
    Select LCase(Type.s)
        
      Case "variable", "pointeur"
        AddElement(PB_Eval_Liste_Code_Variable.s())
        PB_Eval_Liste_Code_Variable.s() = "Define " + CreationVariable$
        
      Case "constante"
        AddElement(PB_Eval_Liste_Code_Variable.s())
        PB_Eval_Liste_Code_Variable.s() = CreationVariable$ + " = 0"
        
      Case "liste"
        AddElement(PB_Eval_Liste_Code_Variable.s())
        PB_Eval_Liste_Code_Variable.s() = "NewList " + CreationVariable$
        
      Case "tableau"
        AddElement(PB_Eval_Liste_Code_Variable.s())
        PB_Eval_Liste_Code_Variable.s() = "Dim " + CreationVariable$
        
      Case "map"
        AddElement(PB_Eval_Liste_Code_Variable.s())
        PB_Eval_Liste_Code_Variable.s() = "NewMap " + CreationVariable$
        
    EndSelect
      
  EndIf
  
  ;}
  
EndProcedure
;}

; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Exemple d'utilisation PB_Eval():
; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

; Type: Variable, Constante, Pointeur, Liste, Tableau, Map.
; Extension: a, b, c, d, f, i, l, q, s, $, u, w.

; Les Numéro ID des Variables ne sont là seulement que pour vous permetre de reperer plus facilement les erreurs, ils ne servent
; à rien d'autre et n'influe pas sur le bon fonctionnement du programme, même si plusieurs Variable on le même ID.

; Attention, Toutes les Constantes créées serront toujours de Format Numérique
; Car la plupart de temps, elle servent à ça et rien d'autre.

; Vous ne pouvez pas utiliser d'extension Structuré pour vos variables
; Ex: Abc.MaStructure, ceci n'est actuellement pas supporté.

; Toutes les Variables créée serront initialisé avec la valeur 0 si c'est
; une Variable Numérique ou "" si c'est une Variable Chaîne de caractères.

PB_Eval_Set_Variable(1, "Abc", "Variable", "a", 0, 0, "", 0)
PB_Eval_Set_Variable(2, "Def", "Constante", "", 0, 0, "", 0)
PB_Eval_Set_Variable(3, "Ghi", "Pointeur", "", 0, 0, "", 0)
PB_Eval_Set_Variable(4, "Jkl", "Liste", "f", 0, 0, "", 0)
PB_Eval_Set_Variable(5, "Mno", "Tableau", "i", 0, 4, "10|25|15|35", 0)
PB_Eval_Set_Variable(6, "Pqr", "Map", "d", 0, 0, "", 0)

; Exemple d'expression:

; Pour utiliser les variables créées, entrez-les sous leur vraie forme, ex: Abc.a, #Def, *Ghi, Jkl.f(), Mno.i(7, 1, 5, 9), Pqr.d()
; Vous n'êtes pas obligé de mettre les Extensions des Variables dans l'Expression sauf pour celle utilisant l'Extension "$".
PB_Eval_Expression.s = "987*98/4*89/4.25 - Pow(2, 8) + Abc.a + *Ghi + Mno.i(10, 10, 10, 10)"

; pb_eval_str (Par Défaut)
; pb_eval_stru
; pb_eval_strf
; pb_eval_strd
; pb_eval_hex
; pb_eval_bin
; pb_eval_string
; pb_eval_script
PB_Eval_Format.s = "pb_eval_strd"

; pb_eval_quad (Par Défaut)
; pb_eval_byte
; pb_eval_ascii
; pb_eval_word
; pb_eval_unicode
; pb_eval_long
; pb_eval_script_string
; pb_eval_script_nombre
PB_Eval_Type.s = "pb_eval_quad"

; #True
; #False (Par Défaut)
PB_Eval_Check.b = #False

; Si le dernier paramètre vaut #True, alors l'expression serra juste vérifié, c'est à dire qu'elle ne serra ni Compilé ni Exécuté !
; Résultat ne serra en conséquence pas Disponible !
PB_Eval(PB_Eval_Expression.s, PB_Eval_Format.s, PB_Eval_Type.s, PB_Eval_Check.b)

Debug "Expression entrée: " + PB_Eval_Get_Expression()
Debug "Variables crées: " + PB_Eval_Get_Variables()
Debug "Format entré: " + PB_Eval_Get_Format()
Debug "Type entré: " + PB_Eval_Get_Type()
Debug "Option entrée: " + PB_Eval_Get_Option()
Debug "Erreur rencontrée: " + PB_Eval_Get_Erreur()
Debug "Résultat de l'expression: " + PB_Eval_Get_Resultat()

Re: PB_Eval()

Publié : sam. 11/mars/2017 21:56
par Shadow
Vous en pensez quoi ?

Est-ce que c'est simple ?
Des idées d'améliorations ?