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
[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE?[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE? par JeremyJeanson
Avec la sortie de la RC de Visual Studio 2010, Microsoft a mis un peu les points sur leS i en ce qui concernait le passage d'arguments. Mais nous somme un certain nombre à avoir pris ce changement comme un coup dur. Pour résumer la situation : à la sortie...
Cliquez pour lire la suite de l'article par JeremyJeanson [RIA SERVICES] INCLUDE ET DOMAINDATASOURCE[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE par Audrey
Dans un de mes articles précédents , j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et po...
Cliquez pour lire la suite de l'article par Audrey ZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATIONZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATION par ROMELARD Fabrice
Une des nouveautés de la version V 3.0 était l'apparition de l'onglet Social qui ne fonctionnait que si le MarketPlace était activé sur son poste. Cela limitait donc son intérêt, car hors du cadre commercial USA-CANADA, peu de monde trouva...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PRATIQUE DE SILVERLIGHT PAR ERIC AMBROSIPRATIQUE DE SILVERLIGHT PAR ERIC AMBROSI par MPOWARE
Je viens de finir la lecture du dernier livre d'
Eric Ambrosi
éditions PEARSON
Son livre donne une approche pratique de Silverlight qui sera aussi bien comprise par le développeur que par le designeur.
Tous les aspects du développement RIA sont abor...
Cliquez pour lire la suite de l'article par MPOWARE APPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NETAPPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NET par odewit
2 déclinaisons de Silverlight et 2 déclinaisons de Mono permettent dorénavant (ou permettront prochainement) de développer des applications .NET mobiles pour les principales plates-formes du marché :
Silverlight pour Symbian, basé sur Silverlight 2...
Cliquez pour lire la suite de l'article par odewit
Forum
RE : DELPHIRE : DELPHI par overtaker
Cliquez pour lire la suite par overtaker
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|