[C++] Gérer des priorités d'opérateur

Gérer des priorités d'opérateur [C++] - C++ - Programmation

Marsh Posté le 28-10-2004 à 20:23:31    

J'ai 2 objets Symbole, qui peuvent contenir soit une variable, une constante ou un opérateur.
 
Je cherche à comparer la priorité de 2 Symboles lorsque ceux-ci sont des opérateurs.
 
Pour cela, je dois stocker les priorités de plusieurs opérateurs dans un structure X, pour qu'elles soient facilement accessible.
 
Qu'est-ce qui serait idéal pour faire ca?
 
ex: comparer la priorité entre s1.chaine et s2.chaine (s1.chaine vaut +, s2.chaine vaut *)
 
un hash serait une bonne solution?

Reply

Marsh Posté le 28-10-2004 à 20:23:31   

Reply

Marsh Posté le 28-10-2004 à 20:36:34    

une valeur décimale... :??:

Reply

Marsh Posté le 28-10-2004 à 20:45:04    

Panini a écrit :

une valeur décimale... :??:


 
ouais ca je le sais
 
mais faut jme créer une structure qui va faire que
 
+ => 7
- => 7
* => 6
/ => 6
% => 6
...
 
je regarde du coté de la STL avec map, mais j'semble incapable de me déclarer un map en dehors de ma class de cette facon:
 

Code :
  1. #include <map>
  2. using namespace std;
  3. map<char, int> priorites;
  4. priorites["*"] = 6;
  5. priorites["/"] = 6;
  6. priorites["%"] = 6;
  7. priorites["+"] = 7;
  8. priorites["-"] = 7;


 
j'ai cette erreur quand je fais ca
 


[yaberger@lfs01]# g++ tp2.cpp
In file included from Expression.h:3,
                 from tp2.cpp:5:
Symbole.h:8: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:8: error: expected `,' or `;' before '=' token
Symbole.h:9: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:9: error: expected `,' or `;' before '=' token
Symbole.h:10: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:10: error: expected `,' or `;' before '=' token
Symbole.h:11: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:11: error: expected `,' or `;' before '=' token
Symbole.h:12: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:12: error: expected `,' or `;' before '=' token

Reply

Marsh Posté le 28-10-2004 à 20:45:55    

utilise des compile time tags

Reply

Marsh Posté le 28-10-2004 à 20:47:08    

Joel F a écrit :

utilise des compile time tags


 
comprends pas  :??:

Reply

Marsh Posté le 28-10-2004 à 20:48:51    

ta classe symbole, passe la en template.
 
template<size_t PRIORITY> class Symbol;
 
et passe en parametre template la valeur de ta priorité.
ensuite,instancie un type par priorité et fait creer des instances de ces types selon leur priorité.

Reply

Marsh Posté le 28-10-2004 à 20:51:17    

Joel F a écrit :

ta classe symbole, passe la en template.
 
template<size_t PRIORITY> class Symbol;
 
et passe en parametre template la valeur de ta priorité.
ensuite,instancie un type par priorité et fait creer des instances de ces types selon leur priorité.


 
faut justement qu'il existe une table dans mon code qui dit que le symbole "+" est de priorité 7 et le symbole "*" de priorité 6, c'est ca que je tente de faire en ce moment. Selon ce que je comprends de ton truc ca m'aidera pas à ca  :sweat:

Reply

Marsh Posté le 28-10-2004 à 20:53:20    

fait toi un bete Lookup table de 255 entrée
et tableau['*'] = 7.
 
tuperds en memoire mais c simple

Reply

Marsh Posté le 28-10-2004 à 20:54:28    

Joel F a écrit :

fait toi un bete Lookup table de 255 entrée
et tableau['*'] = 7.
 
tuperds en memoire mais c simple


 
c'est ca que j'essaye de faire avec map mais ca fonctionne pas
pas obligé d'utiliser map alors?

Reply

Marsh Posté le 28-10-2004 à 20:55:58    

je risque aussi d'avoir éventuellement des "++" et ce genre de truc, alors le 255 entrée pas sur que ca fonctionne ...

Reply

Marsh Posté le 28-10-2004 à 20:55:58   

Reply

Marsh Posté le 28-10-2004 à 20:56:59    

hmmm le ++ oauis c cho :-/

Reply

Marsh Posté le 28-10-2004 à 20:58:40    

Joel F a écrit :

hmmm le ++ oauis c cho :-/


 
spour ca j'envisageais d'utiliser map de la STL
 
sinon le prof avait parlé d'une possibilité d'utiliser enum pour faire ce truc, possible?
 
ou tout betement autre idée?

Reply

Marsh Posté le 28-10-2004 à 21:00:32    

enum ouais mais ca va etre bien lourd

Reply

Marsh Posté le 28-10-2004 à 21:03:22    

Joel F a écrit :

enum ouais mais ca va etre bien lourd


 
ca c'est clair
 
du genre:
 
enum priorites { ADDITION = 7, MULTIPLICATION = 6 };
 
et dans le code jvais devoir vérifier si c'est de quel opérateur il s'agit etc... en gros c'est presque plus facile d'hardcoder le tout dans ma fonction :/

Reply

Marsh Posté le 28-10-2004 à 21:04:21    

ou bien dans mon objet symbole, j'ajoute un élément priorité
 
dans le constructeur, si le symbole est un opérateur, j'entre dans un switch immense qui set la priorité de l'opérateur :/

Reply

Marsh Posté le 28-10-2004 à 21:06:40    

Sensément, à priorité égale, on résout les priorités de gauche  ou de droite à gauche selon le type des opérateurs concernés. Voir la table de priorités des opérateurs dans n'importe quel bouquin de c/c++.

Reply

Marsh Posté le 28-10-2004 à 21:08:51    

Panini a écrit :

Sensément, à priorité égale, on résout les priorités de gauche  ou de droite à gauche selon le type des opérateurs concernés. Voir la table de priorités des opérateurs dans n'importe quel bouquin de c/c++.


 
... ? j'ai bien une table de priorité sous les yeux
 
je cherche le moyen de la consulter dans mon prog
 
jdois lire des expressions comme
 
3 + 4 * 2, les mettre en notation postfixé, et les évaluer
 
le tout se fait à l'aide de pile et de file, mais justement pour pas me retrouver avec  
 
3 4 + 2 *
 
mais bien
 
3 4 2 * +, je dois vérifier les priorités d'opérations

Reply

Marsh Posté le 28-10-2004 à 21:26:08    

Euh, t'as remarqué que tu avais une map de char vers int, mais que tu essayais de mettres des char* dedans (<"> au lieu de <'> )

Reply

Marsh Posté le 28-10-2004 à 21:32:26    

Lam's a écrit :

Euh, t'as remarqué que tu avais une map de char vers int, mais que tu essayais de mettres des char* dedans (<"> au lieu de <'> )


 
j'ai tenté les ' au lieu des " et ca me fait la meme erreur
 
là jme suis ajouté un int priorite dans mon objet symbole et je lui assigne la bonne valeur dans mon constructeur
 
niveau structure de donnée c'est acceptable? sinon j'écoute les autres propositions

Reply

Marsh Posté le 28-10-2004 à 21:38:20    

C'est louche ton truc. Et si tu tentes un:
 map.insert(std:: pair<char,int>('*',6));  
 
ca merde aussi ?


Message édité par Lam's le 28-10-2004 à 21:39:04
Reply

Marsh Posté le 28-10-2004 à 22:02:18    

Lam's a écrit :

Euh, t'as remarqué que tu avais une map de char vers int, mais que tu essayais de mettres des char* dedans (<"> au lieu de <'> )


Exact, y a gros bug en effet.
 
déclare plutôt :  
map<const char *, int> priorites  
voir : map<std::string, int> priorites
 
Le premier cas fonctionne bien si tu fournis les valeurs des clés via des variables globale, de telle sorte que "++" par exemple soit unique (car tu compares le pointeur et non la valeur de la chaine).
 
Le second cas est quand même plus propre.
 

Reply

Marsh Posté le 28-10-2004 à 22:19:09    

mais là tout mon truc fonctionne bien jusqu'ici avec mon constructeur, j'hésite à le modifier, au pire je le ferai lorsque tout sera complet et fonctionnel
 
j'ai déjà 5 des 7 fichiers de test du prof qui passe #1 avec mon prog (les autres c'est parce que j'ai seulement intégré les opérateurs + - * / % pour le moment)
 
:)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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