J’ai récupérer un interpréteur à cette adresse : http://www.codyx.org/snippet_calculer-expr…-simple_63.aspx
Je l’ai adapté pour résoudre des calculs boolean et non double, maleureusement, il a été développé avec des opérations ternaires et je n’arrive pas à ajouter du code pour prendre en compte l’opération ‘NON’.
Voici le code modifié avec que des OU et des ET, quelqu’un peut m’aider pour prendre en compte les non :
[codebox]
Private Function CalcEx(ByVal Text As String, OD_Resultats As Dictionary)
’------------------------
‘Buffer de charactere
Dim Char As String * 1
’Mot temporaire
Dim Word As String
’Operateur en cours
Dim Oprd As String
’------------------------
‘Tableau d’operateurs indentés
Dim Opr() As String
’Tableau de valeurs indentées
Dim Res() As Double
’Valeur en cours
Dim Value As Boolean
’------------------------
'Compteur d’indentation
Dim j As Long
’Variable de boucle
Dim i As Long
ReDim Res(0)
ReDim Opr(0)
Text = Text & " "
For i = 1 To Len(Text)
'Recuperation du charactere
Char = Mid(Text, i, 1)
'Selection en fonction de la valeur du charactere
Select Case Char
’Si c’est un chiffre ajoute dans le buffer
Case “A” To “Z”: Word = Word & Char
’Si c’est un espace calcule l’expression
Case " ": GoSub Calc
’Si c’est une operation calcule et conserve l’operation en memoire
Case “|”: GoSub Calc: Oprd = Char
Case “&”: GoSub Calc: Oprd = Char
'Si c'est une debut paranthese indente la valeur
Case "(":
'Redimentionne le tableau
ReDim Preserve Res(j)
ReDim Preserve Opr(j)
'Sauve la valeur et l'operande
Res(j) = Value
Opr(j) = Oprd
'Increment
j = j + 1
'Initialize les variables temporaires
Value = 0
Word = ""
Oprd = ""
'Si c'est une fin de paranthere decremente la hierarchie
Case ")"
'Si on n'est en indentation "positive"
If j Then
'Calcule l'expression
GoSub Calc
'Decremente
j = j - 1
'Si on dispose d'un operateur
If Opr(j) = "" Then
'NOP
Else
'Calcule
Select Case Opr(j)
Case "|": GoSub Calc: Oprd = Char
Case "&": GoSub Calc: Oprd = Char
End Select
End If
Else
'NOP
End If
'Sinon recupere la valeur pour analyse ulterieure
Case Else: Word = Word & Char
End Select
Next
'That it ! Renvoi le resultat ! (En double precision)
CalcEx = Value
Exit Function
Calc:
'Si on dispose d’un operateur
If Oprd = “” Then
’Si le mot est un chiffre
If Word <> “” And OD_Resultats.Exists(Word) Then
’La valeur egale le mot
Value = CBool(OD_Resultats(Word))
Else
’L’operateur egale le mot
If Len(Word) Then Oprd = UCase(Word)
End If
’Initialise le mot (buffer d’expression)
Word = ""
Else
'Si le mot est numerique
If OD_Resultats.Exists(Word) Then
'Calcule
Select Case Oprd
Case "|": Value = Value Or OD_Resultats(Word)
Case "&": Value = Value And OD_Resultats(Word)
End Select
'Initialise l'operateur
Oprd = ""
Else
'L'operateur prend la valeur du mot
If Len(Word) Then Oprd = UCase(Word)
End If
'Initialise le mot
Word = ""
End If
Return
End Function
Public Sub Test()
Dim OD_Dico As Dictionary
Set OD_Dico = New Dictionary
OD_Dico.Add “V”, True
OD_Dico.Add “F”, False
Debug.Print CalcEx(“V | F | V”, OD_Dico)
End Sub
[/codebox]