Expressions régulières et mathématiques

georhan Messages postés 14 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 24 novembre 2009 - 12 janv. 2004 à 23:17
pichu914 Messages postés 5 Date d'inscription samedi 19 février 2005 Statut Membre Dernière intervention 20 février 2005 - 19 mars 2005 à 20:22
Bonjour à tous :)

Je dois faire pour dans quelques jours (oulà ! déjà !! :p) un TP de gestion et manipulation et gestion d'expressions mathématiques. Par exemple, l'utilisateur rentre une expression (sous forme de chaîne) telle que "2*x-5*cos(y)", et je dois dériver par rapport à une variable, évaluer pour des valeurs données de x et y, etc...
J'en suis actuellement au point de vérification de syntaxe (pour voir si y'a pas d'erreur dans la saisie) et en même temps je transforme l'expression en arbre.
Je dois faire ce TP en JAVA et j'ai choisi les expressions régulières pour analyser la syntaxe de l'expression.

Mon problème se situe à ce niveau : pour reconnaître une expression du type E1 + E2 (ou E1 - E2), comment faut-il faire pour ne pas prendre n'importe quel signe (un signe qui n'est pas entre ( ), et aussi en fait pour prendre le bon ?

Par exemple "(.+)(-)(.+)" marche pour l'expression "3-(2+5)", mais pas pour "3-(2-5)" (car JAVA prend alors en compte uniquement 2-5. (Je mets trois fois des () pour l'analyse récursive).

Merci d'avance pour vos réponses :)

Géorhan

Il n'y a pas de mauvais programmeur. C'est cette p..... de machine de m... qui n'en fait qu'à sa tête !

7 réponses

cs_fred4 Messages postés 3 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 14 janvier 2004
13 janv. 2004 à 15:34
Salut,

Ton probleme viens je pense du fait que telle que tu l'ecris l'ER est ambigue et matche le "mauvais" '-'. Je ne comprends pas bien qu'est ce que te retourne java et qu'est ce que tu souhaites. Peux tu préciser le resultat que tu recuperes dans les 3 groupes ?

Pour ma part si j'avais à récuperer une operation entre deux expressions cela ressemblerais à cela :
(\\([^(]*(\\(.*\\))*[^)]*)\\)|\\w)([-+/*])(\\([^(]*(\\(.*\\))*[^)]*)\\)|\\w)

Soit (E)([-+/*])(E)

Avec E = (\\([^(]*(\\(.*\\))*[^)]*)\\)|\\w)

qui veut simplement dire que l'on prend ce qui se trouve entre la premier parenthese ouvrante et la parenthese fermante correspondante (ou bien un mot si il n'y a pas de parenthese)

Je suis peut etre a cote de la plaque mais si ca aide tant mieux...

Fred
0
cs_fred4 Messages postés 3 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 14 janvier 2004
13 janv. 2004 à 15:38
Correctif / Precision

Je me rends compte que dans mon message ci dessus mes backslash on été "re backslashés" à la publication du message. mon ER ne comporte bie nque des backslash simples.

/* test :
un backslash : \2 backslash : \\\*/
0
georhan Messages postés 14 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 24 novembre 2009
13 janv. 2004 à 16:25
Merci de ta réponse.

- JAVA analyse la chaîne et retourne les derniers patterns correspondant à l'expression régulière (c'est pour cela que c'est coupé au niveau du dernier signe) ;
- Si l'expression est (1-2)-(4-5) :
- 1er groupe : (1-2)-(4
- 2ème groupe : -
- 3ème groupe : 5)
- Mon problème viens bien a priori comme tu le dis d'une ER ambigüe...
- Dans ton écriture de E, il manque une (... où dois-je la placer ?

Encore merci :)

Georhan

Il n'y a pas de mauvais programmeur. C'est cette p..... de machine de m... qui n'en fait qu'à sa tête !
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
13 janv. 2004 à 23:14
GodConan :clown)

ouai moi ;o) chui pas daccord avec la derniere phrase ;o) c tous ...

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fred4 Messages postés 3 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 14 janvier 2004
14 janv. 2004 à 22:55
Ton Probleme vient bien du fait que par defaut une expression reguliere lors de son cherche à faire matcher dans chacun de ces groupes la plus grandes zones possible en commencant par la premiere.

Mon expression est effectivement incorrecte. Il manque une parenthese ouvrante au debut et la parenthese fermante backslashée doit etre deplacée d'un cran vers la gauche :

E=((\\([^(]*(\\(.*?\\))*[^)]*\\))|\\w)
Il faut noter que tu recupereras les valeurs qui t interressent dans $1 $5 et $6.
Cette fois ci c est teste et ca marche sur les expressions avec 1 niveau d imbrication de parenthese.

Tu n'arriveras a mon avis pas faire une expression générique fonctionnant pour tous les niveaux d'imbrication. Cela necessite une recursivite que n'offre pas les ER.

La solution la plus simple a ton probleme reste de faire de l'analyse char par char, en conmptant les parentheses et ce dans une fonction recursive.

Bon courage.

Fred.
0
georhan Messages postés 14 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 24 novembre 2009
15 janv. 2004 à 09:20
Salut ,

En fait deux possibilités s'offraient à moi :
- La première, c'était d'installer et configurer un analyseur syntaxique et/ou grammatical por java (du genre JFlex ou BYacc-Java). Comme je dois rendre ce projet jundi, ça faisait un peu court, même que j'ai déjà fait de ça mais avec du C...
- J'ai donc choisi la deuxième qui, comme tu le dis, consiste à faire une fonction récursive : je prends d'abord tous les signes '+' ou '-' de l'expression, puis je les regarde un par un : s'il est entre des ( ), je l'ignore, sinon c'est une possibilité de "cassure" donc je retiens sa position et les 2 parties de l'expression qui l'entourent. Si tous les signes sont entre ( ), c'est que l'expression est de la forme (E) car je n'accepte pas (...)(...) pour (...)*(...) comme syntaxe. Le fait de garder le signe le plus à droite permet de gérer les chaînes du type 3-2-1 (il faut d'abord casser en "3-2", "-" et "1" cas sinon ça fait 3-(2-1) !!). Puis je fais pareil pour * et /, puis pour ^. Ceci permet de gérer la proirité de ^sur * et / et sur + et -.

J'espère juste que ce raisonnement et correct (je n'ai pas encore fait de tests, mais ça arrive). J'en reparle une fois mon TP fini pour les éventuels futurs intéressés :)

Encore merci pour ton aide !! :)

Georhan

Il n'y a pas de mauvais programmeur. C'est cette p..... de machine de m... qui n'en fait qu'à sa tête !
0
pichu914 Messages postés 5 Date d'inscription samedi 19 février 2005 Statut Membre Dernière intervention 20 février 2005
19 mars 2005 à 20:22
Salut!

j'ai moi aussi un Tp à faire en java pour analyser une expression
simple et la dériver (l'intégrer aussi d'ailleurs...) et je suis un peu
à la rue en java! Pourrais-tu mette sur le forum ton code source et/ou
tes commentaires sur l'analyseur...je me tue sur ces parenthèses à la
con à analyser!



merci!
0
Rejoignez-nous