[JavaCC]Problème pour créer un mini-parser pour prog de math

Problème pour créer un mini-parser pour prog de math [JavaCC] - Java - Programmation

Marsh Posté le 27-01-2005 à 09:04:25    

Bonjour,  
 
Dans le cadre de mon projet de fin d'année, je tente d'utiliser JavaCC mais je bloque avec l'utilisation de ce dernier.  
En effet mon problème est plutôt simple : l'utilisateur entre une formule de calcul propositionnel du style "p | q" ou p et q sont mes variables et "|" est le symbole représentant la disjontion, en gros admettons que c'est une simple addition entre p et q  
De cette formule je veux savoir si elle est conforme (grace au fichier de grammaire si j ai bien compris) et récupérer ainsi les variables entrée "p" et "q"  
Bien sur l'utilisateur peut entrer une formule complexe du genre "(p | q) | r) & z)" donc mon parser doit contrôler si cette formule est bonne et me retourner chaque expression dans un tableau genre "a = (p | q)" et "b = "a | r"...  
La suite de mon programme Java s'occupe ainsi de la résolution de la formule (avec l'établissement de la table de vérité... mais ca je sais faire )  
 
Par exemple si il entre un truc du genre :  
- "(p | q) | r) & )" --> aucune variable après le "&" donc faux.  
- "(p | q) | r) & z" --> parenthèse non fermée.  
Et ben là le parser retourne une erreur...  
 
Bref ca ne semble pas compliqué dans la forme mais j'ai potassé pas mal de tutoriaux et j'ai du mal pour ce qui est de la création des fonctions qui analyse...  
Donc si quelqu'un pouvait me mettre sur la voie pour résoudre ce problème, bref par où commencer ca serait cool  
 
Merci bcp.

Reply

Marsh Posté le 27-01-2005 à 09:04:25   

Reply

Marsh Posté le 27-01-2005 à 09:55:33    

j'ai p't'et pas tout compris (il est encore tot là) mais tu veux valider tes expressions d'un point de vu synthaxique ou sémantique? Si c'est synthaxiquement parlant, je dirais expressions régulières

Reply

Marsh Posté le 27-01-2005 à 17:07:47    

Salut,
 
j'ai fait un interpréteur de formules mathématiques en ActionScript, le langage de flash (basé sur l'ECMA script, donc ressemblant au javascript, normalement assez compréhensible pour un développeur java)
 
url :
http://tom.rethaller.free.fr/proje [...] terpreter/
 
 
en gros, j'ai appliqué un algo de conversion de chaîne en notation polonaise inversée (RPN en english) (( exemple de RPN :  
 
 ((a+b)*c)/2 => a b + c * 2 /  
 
ça permet de se passer des parenthèses, en respectant les priorités (ici ça se traduit par "je prends a, je prends b, j'applique une addition entre les 2, puis, je prends le resultat, je prends c, j'applique une opération de multiplication entre les 2, puis.." etc... )))
 
 
je sais pas si c'est faisable facilement avec des regexp mais ça je connais pas du tout (bonne résolution 2005 => apprendre les regexp)
mais en tous cas avec la RPN c'est pas si sorcier que ça.
 
en gros, ça marche à base de piles, dès que je suis chez moi, j'essaye de retrouver tous ces liens sur la conversion, parce que l'algo est compréhensible mais quand même pas facile à trouver comme ça

Reply

Marsh Posté le 27-01-2005 à 17:10:25    

juste pendant que j'y suis, moi en gros, j'avais fait :
 
* prétraitement de la chaîne (fastoche, 2, 3 remplacements, quelques tests)
* conversion RPN
* evaluation (là c'est gâteau, c'est de la LIFO directement)
 

Reply

Marsh Posté le 27-01-2005 à 18:07:45    

Merci énormément raytaller ca s approche bcp de ceux ke je veux faire je vais potasser ca ce week end et voire comment integrer ca sous forme de grammaire avec JavaCC en tout cas merci bcp d avoir pris le temps de me répondre...
 
Si d autre on de l aide sur JavaCC envoyez :)

Reply

Marsh Posté le 27-01-2005 à 19:07:57    

voilà de la doc théorique et algo :
 
http://miami.int.gu.edu.au/dbs/701 [...] ect05.html
 
 
 
en gros, le truc le plus important c'est :
 


initialise stack and postfix output to empty
while(not end of infix expression)   {
   get next infix item
   if(item is value) append item to postfix output
   else if(item == ‘(‘) push item onto stack
   else if(item == ‘)’)   {
       pop stack to x
       while(x != ‘(‘)  
          append x to postfix output and pop stack to x
   }
   else    {
       while(precedence(stack top) >= precedence(item))
          pop stack to x and append x to postfix output
       push item onto stack
   }
}
while(stack not empty)    
   pop stack to x and append x to postfix output


 
 
bon courage :)


Message édité par raytaller le 27-01-2005 à 19:08:35
Reply

Sujets relatifs:

Leave a Replay

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