Gérer des priorités d'opérateur [C++] - C++ - Programmation
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 :
|
j'ai cette erreur quand je fais ca
|
Marsh Posté le 28-10-2004 à 20:47:08
ReplyMarsh 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é.
Marsh Posté le 28-10-2004 à 20:51:17
Joel F a écrit : ta classe symbole, passe la en template. |
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
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
Marsh Posté le 28-10-2004 à 20:54:28
Joel F a écrit : fait toi un bete Lookup table de 255 entrée |
c'est ca que j'essaye de faire avec map mais ca fonctionne pas
pas obligé d'utiliser map alors?
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 ...
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?
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
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
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++.
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
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 <'> )
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
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 ?
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.
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)
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?