summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/MemoryData.cpp16
-rw-r--r--src/MemoryData.h7
-rw-r--r--src/PolishNotationParser.cpp7
-rw-r--r--src/test.arzu3
4 files changed, 30 insertions, 3 deletions
diff --git a/src/MemoryData.cpp b/src/MemoryData.cpp
index 34e2877..fa7f024 100644
--- a/src/MemoryData.cpp
+++ b/src/MemoryData.cpp
@@ -7,6 +7,10 @@ MemoryData::Type MemoryData::get_type() const {
MemoryData::MemoryData() : type(TNone) {}
+MemoryData* MemoryData::clone() {
+ return new MemoryData(*this);
+}
+
Name::Name() : value() {
this->type = TName;
}
@@ -15,10 +19,22 @@ Name::Name(string& str) : value(str) {
this->type = TName;
}
+MemoryData* Name::clone() {
+ return new Name(*this);
+}
+
Int::Int(int num) : value(num) {
this->type = TInt;
}
+MemoryData* Int::clone() {
+ return new Int(*this);
+}
+
Function::Function(list<string> argNames, int scopeStart, int scopeEnd) : argumentNames(argNames), scopeStart(scopeStart), scopeEnd(scopeEnd) {
this->type = TFunc;
}
+
+MemoryData* Function::clone() {
+ return new Function(*this);
+}
diff --git a/src/MemoryData.h b/src/MemoryData.h
index 06f259a..9f08921 100644
--- a/src/MemoryData.h
+++ b/src/MemoryData.h
@@ -20,6 +20,7 @@ protected:
public:
Type get_type() const;
+ virtual MemoryData* clone();
MemoryData();
~MemoryData() = default;
@@ -29,11 +30,15 @@ struct Name : public MemoryData {
string value;
Name();
Name(string&);
+
+ MemoryData* clone() override;
};
struct Int : public MemoryData {
int value;
Int(int);
+
+ MemoryData* clone() override;
};
struct Function : public MemoryData {
@@ -41,6 +46,8 @@ struct Function : public MemoryData {
int scopeStart;
int scopeEnd;
Function(list<string>, int, int);
+
+ MemoryData* clone() override;
};
#endif
diff --git a/src/PolishNotationParser.cpp b/src/PolishNotationParser.cpp
index 22905a6..bf941d8 100644
--- a/src/PolishNotationParser.cpp
+++ b/src/PolishNotationParser.cpp
@@ -82,6 +82,7 @@ void PNParser::pushToWork(Memory& mem, MemoryData* data, ifstream& inFile) {
void PNParser::parseScope(ifstream& inFile, Memory& mem, int start, int end) {
mem.scopeVars.push(0);
+
bool absorbed = false;
while (start < inFile.tellg() && inFile.tellg() < end && inFile.peek() != EOF) {
skipSpacing(inFile);
@@ -119,10 +120,10 @@ void PNParser::parseScope(ifstream& inFile, Memory& mem, int start, int end) {
/* If value is a variable */
Name* cname;
- for (auto i = ++mem.vars.rbegin(); mem.vars.size() > 0 && i++ != mem.vars.rend(); ++i) {
+ for (auto i = mem.vars.rbegin(); i++ != mem.vars.rend(); ++i) {
cname = static_cast<Name*>(*i);
if (cname->value == name->value) {
- MemoryData* value = new MemoryData(*static_cast<MemoryData*>(*(--i)));
+ MemoryData* value = (*(--i))->clone();
pushToWork(mem, value, inFile);
absorbed = true;
break;
@@ -136,7 +137,7 @@ void PNParser::parseScope(ifstream& inFile, Memory& mem, int start, int end) {
pushToWork(mem, name, inFile);
}
cout << static_cast<Int*>(mem.vars.back())->value << endl;
- // cout << static_cast<Int*>(mem.work.top())->value << endl;
+ cout << static_cast<Int*>(mem.work.top())->value << endl;
for (int i = mem.scopeVars.top(); i > 0; i--) {
delete mem.vars.back();
diff --git a/src/test.arzu b/src/test.arzu
index 57419d1..570efa6 100644
--- a/src/test.arzu
+++ b/src/test.arzu
@@ -1 +1,4 @@
devar a 10
+devar b 2
+
+- * + a a * 4 b / a b