Accueil > Forum > > > > Verification expression logique
Verification expression logique
mercredi 2 janvier 2008 à 16:32:07 |
Verification expression logique

mike600river31
|
Bonjour à tous, Dans mon programme, j'ai un champs dans lequel l'utilisateur doit entrer une expression logique du type : "operande" + "operateur" + "operande" "operande" pouvant être : une lettre ou "(NOT lettre)" ou une équation logique commençant par une "(" et finissant par une ")" "operateur" peut être : AND, OR, NOR Au départ j'avais écris une fonction récursive qui controlait une chaine de type "A AND NOT B OR C" mais finalement je dois gérer des chaines de type : "(A AND (NOT B)) OR (C AND D)" Mais je ne sais pas comment m'y prendre avec les parenthèses pour controler que l'expression entrée est conforme. Y a t il des algo types pour vérifier que la chaine entrée est bien formée? Je n'utilise pas de base de données pour mon appli Merci
|
|
mercredi 2 janvier 2008 à 17:49:53 |
Re : Verification expression logique

Caribensila
|
Salut,
Le plus élégant et le plus didactique pour toi serait d'utiliser les expressions régulières.
Un exemple d'utilisation de la librairie RegExp et, en prime, un excellent utilitaire pour tester les regexp de l'ami Florenth ici.
|
|
mercredi 2 janvier 2008 à 18:09:42 |
Re : Verification expression logique

florenth
|
Salut, Alors, pour ce genre de trucs, je ne suis pas sûr qu'une expression régulière fasse l'affaire. Mais tout dépend de ce que tu cherches à faire: - Soit juste vérifier la syntaxe de l'expression, dans ce cas une procédure récursive simple fait l'affaire
- Soit l'évaluer entièrement et donner un résultat, alors dans ce cas il va falloir aller chercher plus loin.
Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]
|
|
mercredi 2 janvier 2008 à 23:49:36 |
Re : Verification expression logique

CptPingu
|
Le plus simple et le plus élégant reste d'utiliser une grammaire formelle. Une fois ton AST (arbre de syntaxe abstraite) construit, il est facile de calculer et vérifier la validité de l'expression obtenue.
Voici commen j'écrirais une grammaire pour ton problème:
prog ::= expr
expr ::= '(' + expr + ')' | value | expr op expr | 'NOT' expr
op ::= AND | OR | NOR
value ::= TRUE | FALSE | une variable
PS: "Regular expression" ne se traduit pas par "Expression régulière" (beurk !) mais par "Expression rationnelle". C'est comme traduire "library" par "librairie" au lieu de "bibliothèque", c'est très moche !
|
|
jeudi 3 janvier 2008 à 00:40:01 |
Re : Verification expression logique

Caribensila
|
Ok ! Alors j'ai rien dit...  PS: Le jour où les anglophones diront "rational expression", on pourra traduire par "expression rationnelle". Mais, pour le moment, ils disent "regular expression", qu'un puriste devrait traduire par "expression réglementaire". Les expressions rationnelles, quant à elles, restent à inventer... Pour library, je suis tout-à-fait d'accord avec toi, CptPingu. Quoique ce sont les anglophones qui ont adopté le mot français "librairie" qui, au XIVème siècle voulait dire "bibliothèque" (cf: la librairie du château de Chenonceau). Mais c'est sûr que peu de programmeurs ont conscience de parler le français de Ronsard en parlant de "librairie". En tout cas, heureux de te revoir parmi nous et bonne année à toi. :)))
|
|
jeudi 3 janvier 2008 à 11:38:58 |
Re : Verification expression logique

florenth
|
Ouais bon... regular veut dire (entres-autres) régulier donc pour la traduction, il faudra repasser. On pourrait aussi traduire par "familier" qui est le sens de ce mot mais là, ça devient hors-sujet ! Surtout que les regex sont loin d'être familières ! Sinon, AST, ça veut dire "arbre à syntaxe trrrabstraite "... euh pardon ! abstract syntax tree ! Sont gonflants ces anglais !  Sinon, pour éviter les arbres syntaxiques si c'est hors de ta portée (comme c'est le cas pour moi), y'a moyen de s'en sortir avec ce lien : [ Lien ]D'ailleurs ce cours est une vraie anthologie sur la récursivité, les concepts étudiés dedans sont vraiment intéressants. Voila, c'étaient mes 3 cts (3 au lieu de 2... c'est l'inflation). Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]
|
|
jeudi 3 janvier 2008 à 13:14:51 |
Re : Verification expression logique

mike600river31
|
Merci pour vos reponses,
Si je peux eviter les arbres syntaxiques ca m arrangerait.
@florenth : J'ai consulté des cours avec ce type d'exemple, pour le moment j'ai un algo qui ne tient pas compte des parentheses et qui fonctionne, mon gros probleme est d'ajouter la gestion des parentheses dans mon algo
|
|
jeudi 3 janvier 2008 à 14:01:33 |
Re : Verification expression logique

CptPingu
|
Si tu ne cherches qu'à vérifier la syntaxe, alors ce langage est suffisament basique pour te passer de la construction d'un arbre. Il te suffit de suivre la grammaire et de lever une erreur si celle ci n'est pas suivie.
Dans un premier temps tu construis une liste de token à partir de ton expression. C'est à dire que tu stockes dans une liste chainées ou une stringlist, les différentes composantes de l'expression. Par exemple pour "(A AND (NOT B)) OR (C AND D)" cela donnerait: (, A, AND, (, NOT, B, ), ), OR, (, C, AND, D, )
Une fois que tu as cette liste de token, tu regardes la grammaire et tu vérifies quand tu te trouves sur un token si le token suivant est attendu. Par exemple apres une parenthèse ouvrante '(' il ne peut y avoir qu'une parenthèse ouvrant, une valeur ou un opérateur. Si tu tombe sur autre chose ton expression est surement invalide. Tu peux en faire de même pour tous les tokens.
Une fois ceci fait, tu devras aussi vérifier que le nombre de parenthèses ouvrantes est la même que celle fermantes.
|
|
jeudi 3 janvier 2008 à 14:23:41 |
Re : Verification expression logique

mike600river31
|
Ca me parait pas mal du tout comme idee de vérification.
Par contre ca m amene a me poser une autre question (surement bete d'ailleurs) :
Comment decouper mon expression de depart?
Lettre par lettre en testant, quand on trouve un A si il est suivi de N et D
(et pour O si il y a un R et pour N si il y a un O et un T)?
ou on peut faire ce decoupage de maniere plus propre?
|
|
jeudi 3 janvier 2008 à 14:34:41 |
Re : Verification expression logique

CptPingu
|
Je serais tenter de te conseiller de la faire lettre par lettre. Sachant que tes seuls séparateurs sont " ", "(" et ")". Il suffit de stocker tous token en prenant en compte le fait qu'il soit séparé par ces délimiteurs. Par exemple pour: "(A OR B ) AND C" ca donnerait lettre à lettre: (, A, , , , , OR, B, , ), AND, , C
Tu peux procéder comme suit:
index = 0; list = nouvelle liste. flux = ton expression.
tant que (index < taille(expression)) tmp = ""; si flux[index] == "(" ou == ")" alors list.ajouter(flux[index]) sinon tant que (index < taille(expression) et flux[index] != '(' et != ')' et != " ") faire tmp = tmp + flux[index] ; index = index + 1 fin tant que list.ajouter(flux[index]) fin si si index < taille(expression) et (flux[index] == "(" ou == ")") alors
list.ajouter(flux[index]) fin si index = index + 1 fin tant que
C'est pas optimisé, fait un peu l'arrache et en langage algorithmique. (pas de compilo sous la main, dsl).
|
|
Cette discussion est classée dans : type, and, expression, logique, operande
Répondre à ce message
Sujets en rapport avec ce message
Différence de type dans une expression (avec champ TimeStamp) [ par MMarc ]
Bonjour,je voudrais écrire une requête simple sur une table PARADOX du style"Select * from TableName where FieldName = :p1"avec p1 correspondant à une
differnce de type dans une expression [ par kacsad07 ]
voila je veux prevualiser un etat facture avec recherche selon num fac cad je met un num fact dans un edit il m'affiche l'etat fact correspondant et j
Defference de type dans une instruction [ par apz ]
Salut, j'utilise la requete suivante et quand je fais passer le TQUERY1.Active a false le message suivant apparait : defferrence de type dans une inst
différence de type dans une expression [ par manudel ]
J'ai un problème lors de l'exécution d'une requête.A mon avis cela vient du fait que ma variable sdateFin dans ma requête est de type String et que le
Probleme d'execution d'une requete [ par apz ]
Salut,Quand je veux executer ce code j'ai le message d'erreur suivant :Query1: impossible d'effectuer cette operation sur un ensemble de donnees fermé
Valider le type d'un TEdit [ par MasterJ ]
Bonjour tt le mde,comment fait-t-on pour vérifier que le contenu d'un TEdit est bien du type que l'on veut.Plus précisément, j'envoie le contenu d'un
SQl en chaine ! [ par apz ]
Salut a tous,qlq peut m'aider a ecrire ce code sql dans l'editeur de code delphi.Select *From Kiosque, Fact, NumeroWhere (Ref=:mref) and(kiosque.
erreur bde [ par jakouz ]
bonjour,quand j' execute une appl. delphi j'ai le message d' erreur suivant,"probleme sur BDEEngineError : Nom Dupliqué dans ce contexte"mais je ne sa
Jeux du type serpent... [ par g0belin ]
Ben voila, je souhaiterai faire un jeu comme le serpent du Nokia (principe simple bouffe souris=grandis)mais je ne sais pas comment faire le serpent e
tableau dynamique de type TStrings [ par Teardrop ]
Bonjour,je suis sur un petit projet de client mail utilisant le composant Pop3Client du pack ICS de F.Piette.J'aimerai bien pouvoir stocker les header
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|