[C++] expression mathématique

expression mathématique [C++] - C++ - Programmation

Marsh Posté le 31-10-2004 à 02:55:11    

J'ai des expressions mathématiques à lire, à transformer en une file de symbole et à évaluer
 
présentement ca fonctionne plutot bien avec des constantes et des opérateurs binaires de base (+, -, *, /, <, > )
 
mais y'a plein d'autres opérateurs à traiter, ainsi que des variables
 
j'ai donc une class Symbole, composé d'un int "valeur", une string "chaine", d'un int "type" (0 => inconnu, 1 => variable, 2 => constante, ...)
 
présentement, lorsque j'appele le constructeur, je lui passe soit un double ou une string
 
lorsque c'est un double, je l'assigne à "valeur" et j'assigne "2" au type
 
lorsque c'est une string, je l'assigne à "chaine" et je dois déterminer s'il s'agit d'une variable, d'un opérateur (binaire ou unaire, jcrois pouvoir faire ca simplement dans la classe donc j'ai p-e tout faux dans ma conception), une parenthèse ouvrante ou fermante ou un point virgule(qui signifit la fin de l'expression)
 
ya un moyen de déterminer si ma string est une variable (débute par un alpha, suivie par des alphanum ou underscore)? la seule solution que je vois c'est de copier ma string dans un tableau de char et de tester, jtrouve ca un peu mauvais :/
 
pour les opérateurs, justement le fait que jdois vérifier le symbole précédent dans ma file pour déterminer s'il s'agit d'un opérateur binaire ou unaire me fait croire que je ne peux pas déterminer dans mon constructeur de Symbole de quel type d'opérateur il s'agit. Alors comment associer un type à un Symbole? Ca reste logique d'attribuer un type à un Symbole en dehors de son constructeur?
 
l'algo sur lequel je me base présentement:
 


lecture d'un expression
 tant que le symbole n'est pas un point virgule
   lire symbole
   enfiler symbole
 
lecture d'un symbole
  lire un caractere
  si caractere est numérique // constante
    replacer le caractere
    lire un double
    créer un objet Symbole(mon_double)
  sinon
    ma_string = caractere
    si mon_caractere est alpha // variable
      tant que mon prochain caractere est alphanumérique ou un underscore
        lire un caractere et le concaténer à ma_string
    si caractere n'est pas "(" et pas " )" et pas ";" // opérateur
      // traitement pour lire un opérateur de plusieurs caractères
    créer un objet Symbole(ma_string)


 
donc récap de mes problèmes  :sweat:  
déterminer qu'une string est une variable
lire un opérateur sur plusieurs caractères (ex: ++, >=, !=)
déterminer si une string est un opérateur binaire ou unaire (possiblement revoir ma logique de création de symbole)
 
si vous croyez pouvoir aider un peu :/


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 31-10-2004 à 02:55:11   

Reply

Marsh Posté le 31-10-2004 à 10:46:44    

Tu peux pas utiliser des outils comme lex ou yacc ? Ça se fait en quelques minutes avec...

Reply

Marsh Posté le 31-10-2004 à 12:39:15    

C'est clairement un exo de cours, donc certainement pas lex et yacc.
 
> j'ai donc une class Symbole, composé d'un int "valeur", une string "chaine", d'un int "type"
Ca serait pas plus lisible d'employer un type enumere pour ton "type"??
 
Et Burgergold, vu que tu as pas enoncé clairement les parametres de ton pb (par exemple, la liste des operateurs a reconnaitre...) comment veux tu que l'on t'aide...  
A+,


Message édité par gilou le 31-10-2004 à 12:41:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-10-2004 à 13:07:52    

gilou a écrit :

C'est clairement un exo de cours, donc certainement pas lex et yacc.
 
> j'ai donc une class Symbole, composé d'un int "valeur", une string "chaine", d'un int "type"
Ca serait pas plus lisible d'employer un type enumere pour ton "type"??
 
Et Burgergold, vu que tu as pas enoncé clairement les parametres de ton pb (par exemple, la liste des operateurs a reconnaitre...) comment veux tu que l'on t'aide...  
A+,


 
bin même le prof l'a pas énoncé alors on considère que c'est pas mal tous les opérateurs :D


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 31-10-2004 à 13:38:19    

tiens une liste avec leur priorité de ceux que je crois qui sont à être supporté
 


x++ (2) prédécrément
x-- (2) postdécrément
 
++x (3) préincrément
--x (3) prédécrément
!   (3) non logique
+x  (3) + unaire
-x  (3) - unaire
 
* (6) multiplication
/ (6) division
% (6) modulo
 
+ (7) addition
- (7) soustraction
 
<< (8) décalage à gauche
>> (8) décalage à droite
 
<  (9) inférieur
<= (9) inférieur ou égal
>  (9) supérieur
>= (9) supérieur ou égal
 
== (10) égal
!= (10) non égal
 
&  (11) et bit à bit
^  (12) ou exclusif bit à bit
|  (13) ou inclusif bit à bit
&& (14) et logique
|| (15) ou logique
=  (17) affectation
+= (17) opérateur et affectation
(... genre -=, *=, ...)


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 31-10-2004 à 13:40:46    

Commence par écrire une grammaire qui parse tout ça...

Reply

Marsh Posté le 31-10-2004 à 13:48:46    

pascal_ a écrit :

Commence par écrire une grammaire qui parse tout ça...


 
c'est l'un de mes problèmes justement :D
 
lors de la lecture d'un opérateur, jvais devoir testé dans un "GROS" if si l'opérateur existe. S'il existe, jvais prendre un autre caractère de ma chaine, l'ajouter à ma string, et retester si c'est un opérateur qui existe. S'il n'existe pas, alors je replace le caractère dans ma chaine, et je lis le prochain Symbole.
 
Donc disons que j'ai comme expression 1++;
 
Je lis le premier symbole; je prend un caractère, c'est un digit. Je le replace dans ma chaine et je lis un double (qui sera 1).
 
Il me reste ++ dans mon flux d'entrée
 
Je lis le second symbole. je prend un caractère, c'est ni un digit, ni un alpha, ni un ";", ni un "(", ni un " )". Je le considère donc comme un opérateur. Je l'ajoute à ma string. Je teste avec un GROS if si c'est un symbole valide (if string == "+" || string == "-" || ...). Je lis un second caractère, le second +. je l'ajoute à la string et reteste si c'est un opérateur valide. Fin du flux d'entrée, je crée mon objet Symbole à partir de la string ++. Mais là dans mon objet Symbole, je dois déterminer s'il s'agit d'un opérateur unaire ou binaire. Dans ce cas ci, c'est unaire, c'est plutot évident, mais on pourrait avoir un + unaire, qui lui ne saurait pas qu'il est unaire sans savoir dans quel contexte il se trouve (ne doit pas avoir de variable/constante à sa gauche). Et là jsuis bloqué car je détermine et assigne le type dans mon constructeur de symbole présentement
 
edit: d'ailleur l'idée du gros if qui test si la string est l'un des nombreux opérateur que je supporte (pas loin de 30), je trouve ca un peu bourrin (un if avec 30 conditions séparé par des ||, ca fait un peu beurk...)


Message édité par burgergold le 31-10-2004 à 13:54:28

---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 31-10-2004 à 14:16:36    

Tu dois faire un automate qui identifie pour chaque token le type d’ unité lexicale au quel il appartient (exp reg = DFA = scanner = analyseur lexical) puis faire remonter le type d'unité vers le parser (analyseur syntaxique) qui lui verifie si la syntaxe du langage est vérifié sur base de la grammaire et éventuellement d'un table de descision (cf : left parsing, right parsing avec combien de symboles de prévisions) et enfin générer ton code (si tu le fais par descente récursive c'est tout bête)
 
bon amusement mais à mon avis tu ferais bien de commencer par te documenter.....


---------------
"Theres 10 types of people in the world : Those who understand binary and those who don't."
Reply

Marsh Posté le 31-10-2004 à 14:20:52    

peak a écrit :

Tu dois faire un automate qui identifie pour chaque token le type d’ unité lexicale au quel il appartient (exp reg = DFA = scanner = analyseur lexical) puis faire remonter le type d'unité vers le parser (analyseur syntaxique) qui lui verifie si la syntaxe du langage est vérifié sur base de la grammaire et éventuellement d'un table de descision (cf : left parsing, right parsing avec combien de symboles de prévisions) et enfin générer ton code (si tu le fais par descente récursive c'est tout bête)
 
bon amusement mais à mon avis tu ferais bien de commencer par te documenter.....


 
ouin bien le travail c'est quand même pour demain :D
 
le prof nous a fournit 7 fichiers de test (le 7e est meme un fichier pour avoir 1 point bonus sur 10)
 
avec mon présent code, jsuis en mesure d'évaluer les 5 premiers. Le 6e est celui qui comporte des opérateurs unaires ainsi que des opérateurs sur plus d'un caractère
 
donc logiquement jpeux croire que le prof s'attendait à ce qu'on ait de la misère
 
il a d'ailleurs spécifié à la fin du travail: "je ne m'attends pas à ce que vous aillez été en mesure de tout faire. Si vous n'avez pas terminé, remettez votre code pour qu'il soit fonctionnel avec les fonctionnalités que vous avez implanté."
 
donc bon... en plus un ancien étudiant m'a envoyez son ancien tp (dans lequel il dit avoir eu une bonne note) et il est encore moins avancé que moi :/


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 31-10-2004 à 18:21:12    

Ouais, ben c'est un peu débile.  
 
Il y a une façon de faire pour traiter un exo pareil. Ce n'est pas évident du tout au début.
 
Donc soit il vous expose la méthode, mais vous laissez vous débrouiller à bidouiller des solutions bancales c'est  [:w3c compliant]

Reply

Marsh Posté le 31-10-2004 à 18:21:12   

Reply

Marsh Posté le 31-10-2004 à 18:25:31    

pascal_ a écrit :

Ouais, ben c'est un peu débile.  
 
Il y a une façon de faire pour traiter un exo pareil. Ce n'est pas évident du tout au début.
 
Donc soit il vous expose la méthode, mais vous laissez vous débrouiller à bidouiller des solutions bancales c'est  [:w3c compliant]


 
c'est le cas pourtant :D
 
bon bien jcrois que jvais en rester là, j'ai présentement le support des constantes et des opérateurs binaires suivant
 

+
-
*
/
%
<
<=
>
>=
==
!=
&
^
|
&&
||


 
c'est déjà beaucoup plus que certain. J'suis en mesure de traiter parfaitement 5 des 6 fichiers de test du prof.
 
le 6e je le fais à 10/12
 
et le bonus c'est trop compliqué, c'est avec des variables :D
 


[yaberger@lfs01]# cat ../tp2.x
a=5;
b=a*3+a;
c=a+b;
d=(e=1)+(abc=2);
a;b;c;d;e;abc;
++a;
a++;
a;
b=a++ + ++a;
a;
a+=1;
b+=a;
c+=b+=a;b;
c;
c>>=2;c++;
c<<=2;c;


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 01-11-2004 à 11:24:48    

Burgergold a écrit :

ouin bien le travail c'est quand même pour demain :D

:pfff:  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-11-2004 à 16:38:04    

pascal_ a écrit :

Tu peux pas utiliser des outils comme lex ou yacc ? Ça se fait en quelques minutes avec...


 
Ouep, parce que s'il faut que tu réinventes la roue...

Reply

Marsh Posté le 05-11-2004 à 16:51:16    

gaille a écrit :

Ouep, parce que s'il faut que tu réinventes la roue...


 
ouais mais là c'était quand meme un travail dont le but était l'apprentissage


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Sujets relatifs:

Leave a Replay

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