begin process at 2008 08 22 07:01:10
1 229 780 membres
51 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Evaluation d'une expression booléenne contenue dans une string [ Divers / Débutants ] (Arthur24)

Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 09:55:20

Arthur24
Bonjour à tous,

Voici mon problème. Je travaile sous VS2005 et je tente d'évaluer une
condition booléenne contenue dans une variable de type string.

La variable est simplement déclarée par : dim str as string
A l'issu d'un traitement, le contenu de la variable est du type
"((<valeur_booléenne>)AND(<valeur_booléenne>))" et je cherche à évaluer cette
expression pour obtenir la valeur booléenne de l'ensemble de l'expression.


J'ai pensé résoudre le problème par l'appel de Cbool : cBool(str) mais
j'obtiens le message "La conversion de la chaîne "((True)AND(True))" en type
'Boolean' n'est pas valide."

La fonction Cbool n'accepte pas en paramètre de variable de type string.
L'anomalie est la même  avec l'appel directe sous la forme
cbool("((True)AND(True))"). Par contre, l'exécution de cbool((True)AND(True))
retourne bien la valeur True.

La fonction Cbool n'est visiblement pas le bon moyen pour évaluer une chaîne
de caractère contenant une expression booléenne. Mais je ne connais pas
d'autre moyen de résoudre ce problème.



Merci par avance de votre aide.

Re : Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 10:11:00

pneau
Membre Club

salut,
est ce que ta chaine contient systématique 2 booléens ? et le mot clé And ?
le mieux, à mon avis est de faire une recherche grace aux parenthèses.
en parcourant la chaine de manière séquentiel tu pourras détecter les valeurs des booléens et l'opérateur

sinon, tu peux essayer en faisant des recherches des valeurs "TRUE" et "FALSE" avec instr 
      
@+

Pat

 Don't Worry , Be Happy


lorsque le problème est résolu, pensez Réponse Acceptée

Re : Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 10:15:25

pneau
Membre Club
salut (re) regarde ce code, cela devrait t'aider http://www.vbfrance.com/codes/FONCTIONS-INTERESSANTES-EXTRACTION-TEXTE-DANS-EXPRESSION_38798.aspx Pat

Re : Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 10:25:07

Arthur24
L'expression citée est un exemple simplifié.

Elle est du type : [ ( ]  [(<valeur_booléenne>)] [And,Or]  [ (<valeur_booléenne>) ]  [ ) ] ce qui peut donner par exemple :
((((true) and (false)) or (true)) and (false)).

Le parenthésage est toujours complet, sans omission basée sur la priorité des opérateurs logique.


Mon problème n'est pas de détecter les valeurs booléennes mais d'évaluer l'expression complète pour obtenir une valeur booléenne.

Je cherche donc une fonction dont la déclaration pourrait ressembler à :

Function ExvalueExpressionBooleenne(ByVal Expression As String) As Boolean


@+


Re : Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 10:47:22

Renfield
(Admin CS)
Réponse acceptée !
je joues beaucoup avec ce genre de choses, ces temps-ci...

joues avec ton parenthesage, justement...
remplace les variables par 1 ou 0

et traite ce qui se trouve entre parentheses...

((((a) and (b)) or (c)) and (d))
((( 1  and  0 ) or   1 ) and  1 )
((         0       or   1 ) and  1 )
(         1   and  1 )
          1

si tu structures bien la chose, ca devrait etre maintenable et pas trop long

tu parcoures ta chaine, tu mémorise la pos de ta parenthese ouvrante
si tu tombes sur une autre ( , tu stocke sa position (tu ecrase l'autre)
si tu tombes sur ), tu traites (récursif) l'expression contenue entre les deux parentheses et tu modifie la chaine d'entrée...

ca va te simplifier la chose et tu tombera rapidement sur ton résultat.

Renfield
Admin CodeS-SourceS- MVP Visual Basic

Re : Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 11:06:01

Arthur24
C'est bien ce que je craignais, il va falloir que je code un parseur d'expressions booléennes.

J'espérais trouver un bout de code qui ferait le boulot, histoire de ne pas réinventer la roue...


Mais quand il faut y aller !!! Du coup, lorsqu'il sera au point je le posterai

A+



Re : Evaluation d'une expression booléenne contenue dans une string le 07/12/2007 15:10:51

Renfield
(Admin CS)

c'est pas très complexe, tu as l'avantage d'avoir les parentheses bien placées....
l'histoire de 45 minutes de coding, pour avoir un truc fonctionnel...

Renfield
Admin CodeS-SourceS- MVP Visual Basic

Re : Evaluation d'une expression booléenne contenue dans une string le 17/12/2007 16:54:59

Arthur24
Chose promise, chose due, voici une fonction qui évalue les expressions booléennes au format suivant :  [ ( ]  [(<valeur_booléenne>)] [And,Or]  [ (<valeur_booléenne>) ]  [ ) ] ce qui peut donner par exemple : ((((1) and (0)) or (1)) and (0)).

Au cours des tests, je suis tombé sur un cas particulier que je ne traite pas encore correctement, mais que je ne devrais pas rencontrer dans l'appli sur laquelle je travaille  : une expression du type ((1)AND((0)or(1))), càd une expression dont le niveau de parenthésage le plus profond n'est pas le premier exprimé. Dans ce type de cas, ma fonction se plante. Je pense qu'il faudrait non plus parser en recherchant les parenthèses mais plutôt les opérateurs logiques.

N'hésitez pas à me faire part de vos remarques.

    Public Function ParseBoolExp(ByVal ExpressionBool As String) As Boolean
        Dim posO, posF, i As Integer
        Dim FinTrt As Boolean
        'Longueur d'un élément booléen, 3 pour (0) ou (1) et 6 pour (true) ou (fals)
        Const LenElemBool = 3

        FinTrt = False
        i = 0
        While ExpressionBool(i) = "("
            i = i + 1
        End While
        posO = i
        posF = InStr(Mid(ExpressionBool, posO + LenElemBool), ")") + posO + 2
        Select Case Mid(ExpressionBool, posO, posF - posO + 1).ToUpper
            Case "(1)AND(1)", "(0)AND(0)", "(1)OR(1)", "(0)OR(1)", "(1)OR(0)"
                ExpressionBool = Left(ExpressionBool, posO - 1) & "1" & Mid(ExpressionBool, posF + 1)
                If ExpressionBool = "1" Then
                    FinTrt = True
                    ParseBoolExp = True
                End If
            Case "(0)AND(1)", "(1)AND(0)", "(0)OR(0)"
                ExpressionBool = Left(ExpressionBool, posO - 1) & "0" & Mid(ExpressionBool, posF + 1)
                If ExpressionBool = "0" Then
                    FinTrt = True
                    ParseBoolExp = False
                End If
            Case "1", "(1)"
                ParseBoolExp = True
                FinTrt = True
            Case "0", "(0)"
                ParseBoolExp = False
                FinTrt = True
        End Select
        If Not (FinTrt) Then
            ParseBoolExp = ParseBoolExp(ExpressionBool)
        End If


A+

Re : Evaluation d'une expression booléenne contenue dans une string le 17/12/2007 19:39:27

Renfield
(Admin CS)
pas mal... reste a supprimer les parenthèses qui entourent toute la chaine ; ton cas non prévu. vu que tu t'amuses a gérer toutes les combinaisons, suffirait de faire des Replace... remplacer (0)And(1) par (0) etc

Re : Evaluation d'une expression booléenne contenue dans une string le 18/12/2007 10:08:18

Arthur24
Réponse acceptée !

Depuis quelques jours je me disais que des outils externes au code (SQL, Excel,...) devait bien permettre d'évaluer des expressions booléennes. Connaissant mieux SQL, j'ai fait quelques recherches sur le sujet et, ce matin, je suis tombé sur cet article :

http://www.sqlservercentral.com/articles/Advanced+Querying/evaluatingbooleanexpressionsusingtsql/1631/

J'ai trouvé dans la procédure stockée décrite les éléments qui me manquaient pour formater correctement une expression analysable, par exemple, par SQL Server.

Le "AND" devient &, le "OR" devient |, etc.
Le "TRUE" devient 1, le "FALSE" devient 0.

Il suffit de reformater l'expression booléenne de départ pour l'exprimer avec les opérateur du SGBD, constituer une requète du style "SELECT " & MonExpressionBool et d'exécuter le tout comme n'importe quelle requète.

Le SGBD retourne le résultat de l'évaluation, sans soucis de profondeur dans le parenthésage, et quelle qu'en soit la structure.

Bien sur, cette solution n'est pas élégante du point de vue algorithmique. Elle déplaira aux fans de la récursion, mais elle a le mérite d'être simple et immédiatement applicable dans une application adossée à une base de données.

Ces quelques jours auront eu le mérite de me replonger dans les joies des fonctions réccursives, ça faisait longtemps...

Merci à tous de votre aide.




[Page 1 Page 2]
Classé sous : string, true, expression, booléenne, cbool

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS