Analyse syntaxique d'opérations mathématiques

Analyse syntaxique d'opérations mathématiques - Algo - Programmation

Marsh Posté le 08-04-2004 à 22:12:45    

Bonjour,
 
Dans le cadre d'un projet réalisant des développements limités, je me suis heurté au problème de l'analyse syntaxique de fonction.
Exemple : si je demande cos(sin(x)+x+8)+x, ou ln(x+cos(x)+ln(x)) etc. bref, une fonction complexe, comment pouvoir la récupérer sous une forme avec laquelle je pourrai calculer élément par élément, pour contruire le dl au fur et à mesure. (sans tenir compte des ordres, restons simple). J'ai d'abord pensé à une représentation en arbre, mais je ne voyais pas bien comment faire quand on a plusieurs opérandes/opérateurs au même niveau, sans faire moyennement compliqué. J'ai ensuite pensé à la représentation hongroise inversé si je ne m'abuse (pas sûr) (opérateur post fixée), qui simplierai déjà mieux les calculs.
 
J'aimerai donc obtenir votre point de vue sur ces techniques, et avoir d'autres idées peut être ?
 
Merci
 
PS: je ne suis qu'un dut 1ère année, ne forcez pas sur les analyses syntaxiques qu'on étudie en license, et ++.


Message édité par LajioT le 08-04-2004 à 22:15:05
Reply

Marsh Posté le 08-04-2004 à 22:12:45   

Reply

Marsh Posté le 09-04-2004 à 00:49:15    

Déja, tu les reçois comment tes calculs? Ils sont dans un fichier ou quoi? C'est l'utilisateur qui les rentrent? Décris comment ça se passe à ce niveau là, ça me semble important.

Reply

Marsh Posté le 09-04-2004 à 01:57:03    

LajioT a écrit :

J'ai d'abord pensé à une représentation en arbre, mais je ne voyais pas bien comment faire quand on a plusieurs opérandes/opérateurs au même niveau, sans faire moyennement compliqué.  

oué, tu DOIS représenter ton calcul en arbre de Syntaxe Abstraite.
 
pour les opérateurs de même niveau, tu as les priorités pour désambigüiter.
 
par exemple :
 

Code :
  1. 1 + 3 + 5 = ((1 + 3) + 5)
  2. donc l'AST est :
  3. ...+
  4. ../ \
  5. ..+  5
  6. ./ \
  7. 1   3


 
la représentation initiale ne change rien, en POLONAISE inversée, on a :

Code :
  1. 1
  2. 3
  3. +
  4. 5
  5. +


qui conduit au même AST
 
ensuite, ton développement limité sera un ensemble de règles de transformation de cet arbre.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 09-04-2004 à 09:43:07    

L'entrée de ses données me semblent importantes: si il les rentrent en préfixé ou postfixé, alors y'a moyen très facilement de résoudre son truc avec une simple pile.


Message édité par torpe23 le 09-04-2004 à 09:43:21
Reply

Marsh Posté le 09-04-2004 à 16:31:35    

Les données en entrées sont simplement une chaîne contenant l'expression normale mathématiques.
 
Merci nraynaud, je n'avais pas pensé aux priorités comme ton exemple le montre. Reste à bien organiser le tout pour qu'elles fonctionnent correctement, jamais encore fait. Enfin, je verrai.
 
Merci.

Reply

Marsh Posté le 09-04-2004 à 19:12:44    

Bon, après réflexion, je ne sais pas trop par où commençer, et comment parser (c'est le terme approprié non ?) une expression sans bug (à la main, c'est risqué..), etc.
Je pense que je vais commençer par me tourner vers des générateurs d'analyseurs, et apprendre sur le tas ! Que pourrais je utiliser permettant de faire le travail que je veux, en pas trop difficile ?
Y'a t il des cours/tutos assez accessibles à ce sujet ? (je ne suis pour l'instant tomber que sur des sites qui "s'envolent" un peu trop, où ma compréhension n'est plus..)

Reply

Marsh Posté le 09-04-2004 à 23:50:22    

c quoi ton langage. Si c'est en C, moi j'aime bien Lex/Yacc.
Avec ça, pas besoin de faire d'arbre. Tu calcules directement dans les règles de Yacc.

Reply

Marsh Posté le 09-04-2004 à 23:54:24    

Java.
 
Je me suis déjà renseigné concernant les analyseurs (ie: JavaCC, JLex, ATNR, JavaCup), mais je ne sais pas lequel m'est accessible, et pratique pour le travail que j'ai à faire.

Reply

Marsh Posté le 10-04-2004 à 00:14:11    

Moi, je sais qu'en C, avec Lex/Yacc, ton truc est plié en 30mn.
 
Par contre, en Java, je sais pas trop ce qui existe... Faudrait que t'essaie de trouver un truc similaire!


Message édité par torpe23 le 10-04-2004 à 00:14:51
Reply

Marsh Posté le 10-04-2004 à 00:18:58    

JavaCC me semble pas mal. Produit du code un peu lourd, parait-il, mais bon...
 
un p'tit lien:http://www.loria.fr/~cirstea/TEACHING/SYNTAX/


Message édité par torpe23 le 10-04-2004 à 00:19:58
Reply

Marsh Posté le 10-04-2004 à 00:18:58   

Reply

Marsh Posté le 11-04-2004 à 20:46:37    

perso, j'ai toujours utilisé JLex/JavaCup, et j'ai jamais senti le besoin d'utiliser autre chose.
 
La grammaire des expressions dans un langage est généralement la partie la plus facile donc pas de pb.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 12-04-2004 à 04:09:39    

+1 sur le couple JLex/JavaCup, que je prefere de loin a JavaCC :jap:

Reply

Marsh Posté le 12-04-2004 à 15:17:08    

Merci pour vos réponses.
Concernant JavaCC, après maintes lectures, je le trouve plutôt assez clair, et simple d'utilisation. Je n'ai pas encore réalisé ce que je devais, mais les exemples que j'ai vu ne me paraissent pas trop complexe.
Je crois que je vais aller jeter un coup d'oeil à JLex/JavaCup pour vérifier vos dires. ;)

Reply

Marsh Posté le 24-06-2004 à 22:37:34    

euh si j ai bien compris,  
tu dois simplement executer une expression mathematique ?
 
pour faire simple recuperer le resultat de :
(56-0)*4-4+2*(46/(34+5)-5)
c'est ca ? (en rajoutant des fonctions du type sin() cos()..)
 
si oui, tu peux tu faire un parseur en C en 3 fonctions recursives indirectes.
ou alors essaie avec la fonction eval() de perl.

Reply

Marsh Posté le 02-10-2004 à 14:19:21    

si tu veut jai fait un analyser syntaxique complet en Actionscript donc c'est la meme syntaxe que le java. je pourrai te donner les sources

Reply

Marsh Posté le 02-10-2004 à 22:48:44    

spokup a écrit :

si tu veut jai fait un analyser syntaxique complet en Actionscript donc c'est la meme syntaxe que le java. je pourrai te donner les sources


 
 :sweat: j'ai mal lu ou ....

Reply

Marsh Posté le 03-10-2004 à 15:22:41    

Je ne suis pas un fan de la programmation sous flash loin de la. Je fait juste un stage dans une boite ou pour l'instant je fait du flash alors je m'amuse un peu. Cet analyseur syntaxique la je l'ai fait aussi en C++ mais la il veut du java alors ...

Reply

Marsh Posté le 07-10-2004 à 09:51:56    

[:drapal] drapal ! :lol:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed