diff options
| author | Syndamia <kamen@syndamia.com> | 2022-11-30 09:55:13 +0200 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2022-11-30 09:55:13 +0200 |
| commit | 3ddc966106cb24bdbfe5be6571291e76722b3ebb (patch) | |
| tree | 353365046cacc7613999283092d3f9bdbac92cdc /src | |
| parent | 8cf23935113ad8f35c294f23148ec0ff7d99c4e9 (diff) | |
| download | arzu-interpreter-3ddc966106cb24bdbfe5be6571291e76722b3ebb.tar arzu-interpreter-3ddc966106cb24bdbfe5be6571291e76722b3ebb.tar.gz arzu-interpreter-3ddc966106cb24bdbfe5be6571291e76722b3ebb.zip | |
[PNP] Fixed retrieval of value in variable
Diffstat (limited to 'src')
| -rw-r--r-- | src/MemoryData.cpp | 16 | ||||
| -rw-r--r-- | src/MemoryData.h | 7 | ||||
| -rw-r--r-- | src/PolishNotationParser.cpp | 7 | ||||
| -rw-r--r-- | 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<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 |
