From 3ddc966106cb24bdbfe5be6571291e76722b3ebb Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 30 Nov 2022 09:55:13 +0200 Subject: [PNP] Fixed retrieval of value in variable --- src/MemoryData.cpp | 16 ++++++++++++++++ src/MemoryData.h | 7 +++++++ src/PolishNotationParser.cpp | 7 ++++--- src/test.arzu | 3 +++ 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 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, 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(*i); if (cname->value == name->value) { - MemoryData* value = new MemoryData(*static_cast(*(--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(mem.vars.back())->value << endl; - // cout << static_cast(mem.work.top())->value << endl; + cout << static_cast(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 -- cgit v1.2.3