-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoperateur.cpp
91 lines (71 loc) · 2.35 KB
/
operateur.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "operateur.h"
#include "litteralenumerique.h"
#include "litteralecomplexe.h"
Operateur::Operateur(QString op, Pile* p) : type(op), pile(p)
{
if(type=="+" || type=="-" || type=="*" || type=="/" || type=="$")
arite=2;
if(type=="NEG" || type=="DUP" || type=="DROP")
arite=1;
}
bool Operateur::estOperateur(QString type){
return (type=="+" || type=="-" || type=="*" || type=="/" || type=="$" || type=="DUP" || type=="DROP" || type=="SWAP" || type=="LASTOP"
|| type=="CLEAR" || type=="UNDO" || type=="REDO");
}
void Operateur::executer(){
std::vector<LitteraleNumerique*> litterales;
qDebug()<<pile->taille();
/*if(type !="DUP" && type!="SWAP" && type!="LASTOP" && type!="CLEAR" && type=="UNDO" && type=="REDO"){
for(unsigned int i=0; i<arite; i++){
Litterale* tmp = pile->depiler();
if(dynamic_cast<LitteraleNumerique*> (tmp))
litterales.push_back(tmp);
else{
litterales.push_back(dynamic_cast<LitteraleNumerique*> (pile->depiler()));
}
}
pile->setLastArgs(litterales);
}*/
Litterale* newLit;
if(type=="+")
newLit = *litterales.at(0)+ *litterales.at(1);
else if(type=="*")
newLit = *litterales.at(0)*(*litterales.at(1));
else if(type=="-")
newLit = *litterales.at(0)-*litterales.at(1);
else if(type=="/")
newLit = *litterales.at(0)/(*litterales.at(1));
else if(type=="$"){
LitteraleEntiere *lit1 = dynamic_cast<LitteraleEntiere*> (litterales.at(0));
LitteraleEntiere *lit2 = dynamic_cast<LitteraleEntiere*> (litterales.at(1));
newLit = new LitteraleComplexe(lit2, lit1);
}
else if(type=="NEG"){
//newLit =
pile->savePile();
}
else if(type=="DUP"){
pile->dupliquer();
pile->savePile();
}
else if(type=="SWAP"){
pile->swap();
pile->savePile();
}
else if(type=="CLEAR"){
pile->clear();
pile->savePile();
}
else if(type=="UNDO"){
pile->undo();
}
else if(type=="REDO"){
pile->redo();
}
if(type!="DUP" && type!="DROP" && type!="SWAP" && type!="CLEAR" && type!="UNDO" && type!="REDO"){
pile->empiler(newLit);
for(unsigned int i=0; i<arite; i++){
delete litterales.at(i);
}
}
}