Voici la suite, possibilité de créer et utiliser des Variables.
Édit: 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()