Accueil > Forum > > > > Evaluation d'une expression booléenne contenue dans une string
Evaluation d'une expression booléenne contenue dans une string
vendredi 7 décembre 2007 à 09:55:20 |
Evaluation d'une expression booléenne contenue dans une string

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.
|
|
vendredi 7 décembre 2007 à 10:11:00 |
Re : Evaluation d'une expression booléenne contenue dans une string

pneau
|
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 
|
|
vendredi 7 décembre 2007 à 10:15:25 |
Re : Evaluation d'une expression booléenne contenue dans une string

pneau
|
salut (re)
regarde ce code, cela devrait t'aider
http://www.vbfrance.com/codes/FONCTIONS-INTERESSANTES-EXTRACTION-TEXTE-DANS-EXPRESSION_38798.aspx
Pat
|
|
vendredi 7 décembre 2007 à 10:25:07 |
Re : Evaluation d'une expression booléenne contenue dans une string

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
@+
|
|
vendredi 7 décembre 2007 à 10:47:22 |
Re : Evaluation d'une expression booléenne contenue dans une string

Renfield
|
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
|
|
vendredi 7 décembre 2007 à 11:06:01 |
Re : Evaluation d'une expression booléenne contenue dans une string

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+
|
|
vendredi 7 décembre 2007 à 15:10:51 |
Re : Evaluation d'une expression booléenne contenue dans une string

Renfield
|
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
|
|
lundi 17 décembre 2007 à 16:54:59 |
Re : Evaluation d'une expression booléenne contenue dans une string

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+
|
|
lundi 17 décembre 2007 à 19:39:27 |
Re : Evaluation d'une expression booléenne contenue dans une string

Renfield
|
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
|
|
mardi 18 décembre 2007 à 10:08:18 |
Re : Evaluation d'une expression booléenne contenue dans une string

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.
|
|
Cette discussion est classée dans : string, true, expression, booléenne, cbool
Répondre à ce message
Sujets en rapport avec ce message
Probleme : String >> 255 caracteres ?? [ par Danyz ]
Voila , j'ai fait un programme de base de données pour gerer des collections d'albums audio.Je vient de mettre une option pour changer la casse des te
Appartenance d'une string dans une autre [ par laglobule ]
Alors voila, est ce qu il existerait en VB une fct capable de retourner un booleen=TRUE si une string est contenue dans une autre et FALSE sinonex : s
Appartenance d'une string dans une autre [ par laglobule ]
Alors voila, est ce qu il existerait en VB une fct capable de retourner un booleen=TRUE si une string est contenue dans une autre et FALSE sinonex : s
port com et excel [ par tontonmsirda ]
j'essaie d'envoyer des données sur excel depuis le port com et ça marche.mon probleme est que lorsque je commence à envoyer les données, je n'arrive p
[déplacé VB.NET -> VBA] Soucis dans l'emploi d'une string en argument [ par NoEnclumeSVP ]
Salut, Je dois développer une macro Excel qui doit aller chercher dans une feuille une liste d'entités (des clients) qui serviront dans une autre feu
interpreter un string [ par fatmaboule ]
hello a tous,j'ai un probleme que je ne vois pas trop comment resoudre:j'ai d'un coté une regle definie dans un string exemple: "(A / B ) + C"cette
nullpointerexception [ par sheorogath ]
g essaye de faire un petit morceau de code qui se trouve dans une frame pour choisir les option et ce que je voulais faire ct des checkbox qui verifie
Récupéré du text entre balise sur un site [ par Birkin VB ]
Bonjour je voulais recupéré le text entre les balise en utilisent Private Function MyMid(ByRef Expression As String, sLeft As String, sRight As Stri
FTPES [ par huuuuu21 ]
Bonjour à tous, Je suis en train de pas mal galérer sur un problème que l'on m'a posé au bureau. Je dois réaliser une application .NET qui dépose un
Mettre le nom d'une sub dans une variable string [ par Elodie33 ]
Voila mon application comporte N sub x et j'aimerais mettre le nom de la sub x en cours dans une variable string pour afficher dans un message box. C
Livres en rapport
|
Derniers Blogs
XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio [WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|