From c6f9707d797ebe4aaf9b67646513506124217d9d Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sat, 26 Sep 2020 23:45:20 -0400 Subject: [PATCH] Choices rewritten, lists being worked on --- DMS/Character.h | 1 + DMS/DMS.cpp | 20 ++-- DMS/Handlers.cpp | 20 +++- DMS/Handlers.h | 7 +- DMS/LineParser.h | 1 + DMS/LineParserMatchProcess.cpp | 25 ++-- DMS/LineParserParse.cpp | 17 ++- DMS/LineParserUtils.cpp | 14 +++ DMS/codes.cpp | 3 +- DMS/codes.h | 1 + DMS/dms_exceptions.h | 5 + DMS/dms_state.cpp | 25 +++- DMS/dms_state.h | 8 +- DMS/dms_state_interpret.cpp | 88 ++++++++++---- DMS/dump.bin | Bin 2393 -> 1868 bytes DMS/dump.txt | 203 ++++++++++++++++++--------------- DMS/test.dms | 8 +- DMS/value.cpp | 33 ++---- DMS/value.h | 2 +- 19 files changed, 297 insertions(+), 184 deletions(-) diff --git a/DMS/Character.h b/DMS/Character.h index 0e2256d..5510591 100644 --- a/DMS/Character.h +++ b/DMS/Character.h @@ -7,6 +7,7 @@ namespace dms { std::string fname = ""; std::string lname = ""; bool seen = false; + double spd = 100; std::unordered_map paths; std::unordered_map values; }; diff --git a/DMS/DMS.cpp b/DMS/DMS.cpp index d026c87..157e43a 100644 --- a/DMS/DMS.cpp +++ b/DMS/DMS.cpp @@ -4,16 +4,14 @@ #include using namespace dms; // You can use your own choice handler! -class myChoi : public choiceHandler { - uint8_t manageChoice(dms_state* state, dms_args choices) const override { - uint8_t count = choices.args.size(); - uint8_t pos; - std::string prompt = choices.args[0]->s->getValue(); - for (size_t i = 1; i < count; i++) - std::cout << i << ": " << choices.args[i]->s->getValue() << std::endl; - std::cout << prompt; +class myHandler : public Handler { + uint8_t manageChoice(dms_state* state, std::string prompt, std::vector args) const override { + std::string pos; + for (size_t i = 0; i < args.size(); i++) + std::cout << i << ": " << args[i] << std::endl; + std::cout << prompt << " "; std::cin >> pos; - return pos; + return std::stoi(pos) - 1; } }; int main() @@ -21,12 +19,12 @@ int main() LineParser parser = LineParser("test.dms"); dms_state* state = parser.Parse(); try { - //state->setChoiceHandler(new myChoi); + //state->setHandler(new myHandler); } catch (std::exception& e) { std::cout << e.what() << '\n'; return -1; } - //state->dump(); + state->dump(); state->run(); } \ No newline at end of file diff --git a/DMS/Handlers.cpp b/DMS/Handlers.cpp index 5d3550b..8633c7f 100644 --- a/DMS/Handlers.cpp +++ b/DMS/Handlers.cpp @@ -1,13 +1,21 @@ #include "Handlers.h" namespace dms { - uint8_t choiceHandler::manageChoice(dms_state* state, dms_args choices) const { - uint8_t count = choices.args.size(); + uint8_t Handler::manageChoice(dms_state* state, std::string prompt, std::vector args) const { std::string pos; - std::string prompt = choices.args[0]->s->getValue(); - for (size_t i = 1; i < count; i++) - std::cout << i << ": " << choices.args[i]->s->getValue() << std::endl; + for (size_t i = 0; i < args.size(); i++) + std::cout << i+1 << ": " << args[i] << std::endl; std::cout << prompt << " "; std::cin >> pos; - return std::stoi(pos)-1; + try { + if (std::stoi(pos) > 0 && std::stoi(pos) < args.size()) + return std::stoi(pos) - 1; + else + throw exceptions::InvalidChoice(); + } + catch (std::exception e) { + std::cout << "Invalid Choice!" << std::endl; + return manageChoice(state,prompt,args); + } + } } \ No newline at end of file diff --git a/DMS/Handlers.h b/DMS/Handlers.h index 1908832..73d6154 100644 --- a/DMS/Handlers.h +++ b/DMS/Handlers.h @@ -1,10 +1,13 @@ #pragma once #include "value.h" #include "utils.h" +#include "Character.h" #include namespace dms { - struct choiceHandler + struct Handler { - virtual uint8_t manageChoice(dms_state* state, dms_args choices) const; + virtual uint8_t manageChoice(dms_state* state, std::string prompt, std::vector args) const; + //virtual bool manageSpeaker(dms_state* state, character* chara) const; + //virtual bool manageMessage(dms_state* state, value* msg) const; }; } diff --git a/DMS/LineParser.h b/DMS/LineParser.h index 4187c78..7a4c2a5 100644 --- a/DMS/LineParser.h +++ b/DMS/LineParser.h @@ -94,6 +94,7 @@ namespace dms { bool isBlock(blocktype bk_type); void tolower(std::string &str); void tokenizer(dms_state* state, std::vector &tok); + void debugInvoker(tokenstream* stream); public: //Refer to streams.cpp for the match_process_CMD code. dms_state* Parse(); diff --git a/DMS/LineParserMatchProcess.cpp b/DMS/LineParserMatchProcess.cpp index 71e64f3..5d1d3c6 100644 --- a/DMS/LineParserMatchProcess.cpp +++ b/DMS/LineParserMatchProcess.cpp @@ -72,6 +72,7 @@ namespace dms { current_chunk->addCmd(c); bool ready = true; while (tempstream.peek().type != tokens::none) { + debugInvoker(stream); if (tempstream.match(tokens::cbracketc)) { ready = true; c = new cmd; @@ -184,6 +185,7 @@ namespace dms { stream->next(); stream->next(); while (stream->peek().type != tokens::cbracketc) { + debugInvoker(stream); if (stream->match(tokens::name)) { std::string mode = stream->next().name; if (mode == "speed") { @@ -302,9 +304,12 @@ namespace dms { std::string option; cmd* c = new cmd; // Create a unique label name by using the line number - std::string choicelabel = concat("$CHOI_END_", stream->peek().line_num); + int CHOI_ID = 0; + std::string choi_str = concat("CHOI_", fn); + std::string choicelabel = concat("$CHOI_END_", choi_str,"_", stream->peek().line_num); c->opcode = codes::CHOI; c->args.push(buildValue(prompt)); + c->args.push(buildValue(fn)); current_chunk->addCmd(c); // We will keep a reference to this and add to it as we go through the list bool start = false; bool hasfunc = false; @@ -340,6 +345,10 @@ namespace dms { If we are provided with a number greater than 3 then we can push an execption. */ while (!stream->match(tokens::cbracketc)) { + debugInvoker(stream); + if (start && !stream->match(tokens::newline)) { + buildLabel(concat(choi_str,"_", CHOI_ID++)); + } if (stream->match(tokens::cbracketo) && !start) { start = true; stream->next(); @@ -357,15 +366,9 @@ namespace dms { hasfunc = true; buildGoto(choicelabel); } - else if (match_process_goto(stream)) { - buildNoop(); // Add noop to post-goto command - } - else if (match_process_jump(stream)) { - buildNoop(); // Add noop to post-jump command - } - else if (match_process_exit(stream)) { - buildNoop(); // Add noop to post-exit command - } + else if (match_process_goto(stream)) {} + else if (match_process_jump(stream)) {} + else if (match_process_exit(stream)) {} } // Last Match else if (stream->match(tokens::newline)) { @@ -459,6 +462,7 @@ namespace dms { value* ref = buildVariable(); // This part we add values to the opcodes for the bytecode FUNC val a1 a2 a3 ... an while (tempstream.peek().type != tokens::none) { // End of stream + debugInvoker(stream); tempval = buildVariable(); tok = tempstream.peek(); if (tempstream.match(tokens::seperator)) { @@ -600,6 +604,7 @@ namespace dms { size_t loops = 0; bool hasOP = false; while (stream->peek().type != tokens::none) { + debugInvoker(stream); if (stream->match(tokens::parao)) { tokenstream temp; temp.init(&(stream->next(tokens::parao, tokens::parac))); // Balanced match! diff --git a/DMS/LineParserParse.cpp b/DMS/LineParserParse.cpp index 12f1b22..e49207c 100644 --- a/DMS/LineParserParse.cpp +++ b/DMS/LineParserParse.cpp @@ -35,7 +35,7 @@ namespace dms { rawdata << line << ";\n"; } myfile.close(); - //std::cout << rawdata.str() << std::endl; + fn = file; } else { std::cout << "Unable to open file"; @@ -331,15 +331,14 @@ namespace dms { token current = stream->next(); createBlock("$INIT", blocktype::bt_block); cmd* flagcmd = new cmd; - size_t current_line = 0; + if (state->isEnabled("debugging")) { + cmd* c = new cmd; + c->opcode = codes::FILE; + c->args.push(buildValue(fn)); + current_chunk->addCmd(c); + } while (stream->peek().type != tokens::eof) { - if (stream->peek().line_num != current_line) { - current_line = stream->peek().line_num; - cmd* ln = new cmd; - ln->opcode = codes::LINE; - ln->args.push(buildValue((int)current_line+1)); - current_chunk->addCmd(ln); - } + debugInvoker(stream); if (current.type == tokens::flag) { temp = stream->next(tokens::newline); stream->prev(); // Unconsume the newline piece diff --git a/DMS/LineParserUtils.cpp b/DMS/LineParserUtils.cpp index e41271a..d212c79 100644 --- a/DMS/LineParserUtils.cpp +++ b/DMS/LineParserUtils.cpp @@ -215,6 +215,20 @@ namespace dms { c->args.push(buildValue(w)); current_chunk->addCmd(c); } + void LineParser::debugInvoker(tokenstream* stream) { + if (state->isEnabled("debugging") && stream->peek().type != tokens::newline) { + // A very nasty if statement, I won't hide it, this could be made much more readable + // This checks if the last cmd is a LINE cmd and if its the same line number as the current one we simply skip it + if (current_chunk->cmds.size() >= 2 && current_chunk->cmds[current_chunk->cmds.size() - 1]!=nullptr && current_chunk->cmds[current_chunk->cmds.size() - 1]->opcode==codes::LINE && (size_t)current_chunk->cmds[current_chunk->cmds.size()-1]->args.args[0]->n->getValue()== (size_t)stream->peek().line_num) { + return; + } + int current_line = stream->peek().line_num; + cmd* ln = new cmd; + ln->opcode = codes::LINE; + ln->args.push(buildValue(current_line)); + current_chunk->addCmd(ln); + } + } bool LineParser::createBlock(std::string bk_name, blocktype bk_type) { if (current_chunk != nullptr) { if (state->chunks.count(bk_name)==0 && bk_name!="$END") diff --git a/DMS/codes.cpp b/DMS/codes.cpp index cbe7b44..6e32068 100644 --- a/DMS/codes.cpp +++ b/DMS/codes.cpp @@ -45,5 +45,6 @@ const std::string dms::codes::list[] = { "MOD", "LIST", "LINE", - "HALT" + "HALT", + "FILE" }; \ No newline at end of file diff --git a/DMS/codes.h b/DMS/codes.h index 16c7b32..4e3b644 100644 --- a/DMS/codes.h +++ b/DMS/codes.h @@ -48,6 +48,7 @@ namespace dms::codes { LIST, LINE, HALT, + FILE }; extern const std::string list[]; static bool isControl(const op code) { diff --git a/DMS/dms_exceptions.h b/DMS/dms_exceptions.h index 8a5d802..b1930b1 100644 --- a/DMS/dms_exceptions.h +++ b/DMS/dms_exceptions.h @@ -11,5 +11,10 @@ namespace dms::exceptions { return "ChoiceHandler Expected got ???"; } }; + struct InvalidChoice : public std::exception { + const char* what() const throw () { + return "Invalid Choice!"; + } + }; } diff --git a/DMS/dms_state.cpp b/DMS/dms_state.cpp index 9298e69..a6ddd94 100644 --- a/DMS/dms_state.cpp +++ b/DMS/dms_state.cpp @@ -16,7 +16,7 @@ namespace dms { cc->args.push(buildValue(0)); c->addCmd(cc); push_chunk("$END", c); - setChoiceHandler(new choiceHandler); // Use the default implementation + setHandler(new Handler); // Use the default implementation } bool dms_state::characterExists(std::string bk_name) { return (chunks.count(bk_name) && chunks[bk_name]->type == blocktype::bt_character); @@ -49,6 +49,22 @@ namespace dms { } outputFile.close(); } + bool dms_state::assign(value* var, value* val) { + if (memory.count(var->s->getValue()) == 0) { + memory.insert_or_assign(var->s->getValue(), val); + return true; + } + else { + value* temp = memory[var->s->getValue()]; + if (temp->type != datatypes::variable) { + temp->set(); // Set the removed value to nil + garbage.push_back(memory[var->s->getValue()]); + } + else + utils::print("> so we have a variable"); // This print should be a reminder for me to do something about this. + memory[var->s->getValue()] = val; + } + } void dms_state::dump() { std::cout << "Number of chunks: " << chunks.size() << std::endl; std::ofstream outputFile("dump.bin"); @@ -62,7 +78,12 @@ namespace dms { chunks.insert_or_assign(s, c); } void dms_state::push_error(errors::error err) { - std::cout << err.err_msg << " On Line <" << err.linenum << ">" << std::endl; + if (isEnabled("debugging")) { + std::cout << err.err_msg << " On Line <" << cur_line << ">" << std::endl; + } + else { + std::cout << err.err_msg << std::endl; + } this->err = err; if (err.crash) stop = true; diff --git a/DMS/dms_state.h b/DMS/dms_state.h index 1c57c5e..dc0c74f 100644 --- a/DMS/dms_state.h +++ b/DMS/dms_state.h @@ -15,13 +15,15 @@ namespace dms { struct dms_state { - void* choi = nullptr; + void* handler = nullptr; std::unordered_map memory; std::vector garbage; std::map chunks; std::map characters; + std::map labels; std::string entry = "$undefined"; std::map enables; + std::size_t cur_line=0; const double Iversion = 1.0; double Cversion; // The version of errors::error err; @@ -38,9 +40,11 @@ namespace dms { void enable(std::string flag); void disable(std::string flag); bool isEnabled(std::string flag); - void setChoiceHandler(void* choi); + void setHandler(void* hand); // Gets or creates a character + bool assign(value* var, value* val); + size_t seek(std::string label,std::vector cmds ,codes::op code, size_t pos); character* getCharacter(std::string c); bool characterExists(std::string bk_name); bool blockExists(std::string bk_name); diff --git a/DMS/dms_state_interpret.cpp b/DMS/dms_state_interpret.cpp index fbd143a..9ef9b79 100644 --- a/DMS/dms_state_interpret.cpp +++ b/DMS/dms_state_interpret.cpp @@ -7,8 +7,8 @@ using namespace dms::exceptions; using namespace dms::codes; namespace dms { // This is a pointer to a choicehandler! dms_state and utils have codepedencies, so I have to do this. - void dms_state::setChoiceHandler(void* choi) { - this->choi = choi; + void dms_state::setHandler(void* hand) { + this->handler = hand; } character* dms_state::getCharacter(std::string cha) { if (characters.count(cha)) { @@ -61,12 +61,19 @@ namespace dms { return cc; } else { - push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to index a non existing character!") }); + push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to index a non existing character block!") }); return nullptr; } } return nullptr; } + size_t dms_state::seek(std::string label, std::vector cmds, codes::op code, size_t pos) { + for (size_t i = pos; i < cmds.size(); i++) { + if (cmds[i]->opcode == code && cmds[i]->args.args[0]->s->getValue() == label) + return i; + } + return 0; + } void dms_state::init(chunk* chunk, size_t& pos, size_t& max, std::vector& cmds) { pos = 0; max = chunk->cmds.size(); @@ -86,7 +93,7 @@ namespace dms { size_t max = 0; std::vector cmds; if (chunks[entry] == NULL) { - push_error(errors::error{errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block <",entry,">")}); + push_error(errors::error{errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block [",entry,"]")}); return false; } init(chunks["$INIT"],pos,max,cmds); @@ -99,8 +106,8 @@ namespace dms { while (!stop || !halt) { c = cmds[pos++]; code = c->opcode; - //utils::print("> ",*c); - //utils::wait(); + //print("\n(",pos,")> ",*c); + //wait(); switch (code) { // Handle flags here @@ -124,8 +131,33 @@ namespace dms { // How we add modules into the code. This is the code that actually loads that data! break; // Flags handled + case LIST: + //We need to create an enviroment value then set that + { + dms_env* env = new dms_env; + env->hpart.insert_or_assign("$size", c->args.args[1]); + value* val = new value; + val->set(env); + assign(c->args.args[0], val); + } + break; + case INST: + { + value* list = memory[c->args.args[0]->s->getValue()]; + list->e->pushValue(c->args.args[1]); + } + break; case HALT: - wait(); + //wait(); + break; + case DSPD: + if (speaker == nullptr) { + push_error(errors::error{ errors::unknown ,utils::concat("A call to set speaker speed, but a speaker has not been defined!") }); + return false; + } + else { + speaker->spd = c->args.args[0]->n->getValue(); + } break; case SSPK: if (characterExists(c->args.args[0]->s->getValue())){ @@ -145,36 +177,46 @@ namespace dms { utils::write(c->args.args[0]->s->getValue()); break; case ASGN: - if (memory.count(c->args.args[0]->s->getValue()) == 0) { - memory.insert_or_assign(c->args.args[0]->s->getValue(), c->args.args[1]); - } - else { - value* temp = memory[c->args.args[0]->s->getValue()]; - if (temp->type != datatypes::variable) { - temp->set(); // Set the removed value to nil - garbage.push_back(memory[c->args.args[0]->s->getValue()]); - } - else - print("> so we have a variable"); - memory[c->args.args[0]->s->getValue()] = c->args.args[1]; - } + assign(c->args.args[0], c->args.args[1]); break; case LINE: - ln = c->args.args[0]->n->getValue(); + cur_line = c->args.args[0]->n->getValue(); break; case NOOP: break; case CHOI: //Because we are using void* we must cast our pointers //The implementation of this however should mean that you only ever have to deal with one "ChoiceHandler. One annoying void*" - pos += 2* (*(choiceHandler*)choi).manageChoice(this, c->args); + { + std::vector args; + std::string prompt = c->args.args[0]->s->getValue(); + std::string fn = c->args.args[1]->s->getValue(); + for (size_t i = 2; i < c->args.args.size(); i++) + args.push_back(c->args.args[i]->resolve(memory)->s->getValue()); + size_t npos = (*(Handler*)handler).manageChoice(this, prompt, args); + print("CHOI_", fn, "_", npos); + size_t nnpos = seek(concat("CHOI_", fn, "_", npos),cmds,LABL,npos); + if (!nnpos) { + push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown choice!") }); + return false; + } + else { + print(nnpos); + pos = nnpos; + wait(); + } + } break; case JUMP: // Value assert resolves the data so a variable must eventually equal a string if (utils::valueassert(c->args, memory, datatypes::string)) { std::string block = c->args.args[0]->resolve(memory)->s->getValue(); if (chunks[block] == NULL) { - push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block <",block,">") }); + push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block [",block,"]") }); + return false; + } + else if (chunks[block]->type != bt_block) { + push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non standard block [",block,"] type: ",getBlockType(chunks[block]->type))}); return false; } else { diff --git a/DMS/dump.bin b/DMS/dump.bin index 165b5639e16887fd7b6df32814ac54d90adbb443..6fa8aac5a22163755869ffabe554fcc53d7f7c05 100644 GIT binary patch literal 1868 zcmaJ?-%sK|5Ej$$K*Ikp=1A@hr3!i%a+hj3>B$u$RqoBKbfJyyE@>CJ{`WWg1Bw-W zAnblS`+YOBGt)a-e23P+cl*x?pTGQQHU@va0BUE@Y&08p>eTbSpgi`2d$3Xxvm-Pa z_|7$08-WQ-NvUPrx#rLPc|l;F1Zh)R$?6BNiuRG%J(Re{SYaHRqD(#IlO)6!R2W4p4$vcgi>M1^#6=!^pV(^=l|>?McoU2PX& zXihtr`Q4VR6aF9=b0ur4$vL|d+HjcL7 z8z32lg0CUusP*%mn7l5%G>ipEb?<8mOU^@xN`m)Sjh`xJ6HB|@-cz_4jyYq?ya`%HbvC9ib+h*0|pT}&* z0izo=xcey;5f8DY%MO4qDmv3G8h1I(Ar`PAIE+C=aW0p*&-jXFNwHsx`bM;lq{oKk zP^0F8t`6zrTfVJY$91tf~;{{1D$w#sM3ob@cc>9{m`Oi=1XQO||F`Ryc^Rx4_M{ONPMx4cBR6ROK6;Me)a?^U1MAObaFqb^;h48;;IWaELYlB#bw`85GBXP8Hu#c9Z68$C+QU#op zS&lm<49bUnB`bfS?qs#S73Hrc%^pMY=r!Z0&ZTm}Vfu9%+2(a@41n(W9UBXRY=e%C z^+2{^$HsXh+f~QLnIqeE+vXE3jPu6WwCvxhYAu)!D&M`@)~Uoo#S)2;Nn3so!BdRa ztSp!=ox#~``UpKN2RsqZrXidT2|*a#$KY5=6N|w#!peORc`ku8`yOcbC7_Pu=_;@% z zfJTePaMLPvk0f#bFd2jMk|qj6(GhKuQh}2Ai%&apr7~H9%S(@!J}(En9P;vtp#1$U zx`!Ug-ZQ#)Xsr`x%izl-o`7>fSbku$|KXvxT_2>g^cPJg)7@rIr2_eHHqCvBaJpN) z?lA^pagh0>sm0*#=@5ir&1XgVt)5Vdjh;)lg;1$nH1%ra)noNNv z;@XUa9#xYm;)^T2O_09h>IOgDnX`SUcX!7Z_{Y=8 flag Line <3> name omniscient Line <3> newline Line <3> newline +Line <4> flag +Line <4> name forseelabels +Line <4> newline Line <4> newline -Line <5> flag -Line <5> name debugging Line <5> newline -Line <5> newline -Line <6> flag -Line <6> string loadtest.dms -Line <6> newline Line <6> newline Line <7> flag -Line <7> number 1.2 +Line <7> string loadtest.dms Line <7> newline Line <7> newline Line <8> flag -Line <8> name extendedDefine +Line <8> number 1.2 Line <8> newline Line <8> newline +Line <9> flag +Line <9> name extendedDefine Line <9> newline Line <9> newline -Line <10> bracketo [ -Line <10> name main -Line <10> bracketc ] Line <10> newline Line <10> newline -Line <11> string Testing +Line <11> bracketo [ +Line <11> name main +Line <11> bracketc ] Line <11> newline Line <11> newline -Line <12> name Bob -Line <12> colon : -Line <12> cbracketo { +Line <12> string why Line <12> newline Line <12> newline -Line <13> name speed -Line <13> number 50 +Line <13> name works +Line <13> equal = +Line <13> true true Line <13> newline Line <13> newline -Line <14> name excited -Line <14> colon : -Line <14> string Hello Ryan! +Line <14> jump +Line <14> name Bob Line <14> newline Line <14> newline -Line <15> name wait -Line <15> number 200 +Line <15> string Testing Line <15> newline Line <15> newline -Line <16> string How are you doing? +Line <16> name Bob +Line <16> colon : +Line <16> cbracketo { Line <16> newline Line <16> newline -Line <17> cbracketc } +Line <17> name speed +Line <17> number 50 Line <17> newline Line <17> newline +Line <18> name excited +Line <18> colon : +Line <18> string Hello Ryan! Line <18> newline Line <18> newline -Line <19> name Ryan -Line <19> colon : -Line <19> cbracketo { +Line <19> name wait +Line <19> number 200 Line <19> newline Line <19> newline -Line <20> string Hey Bob I'm good how are you? +Line <20> string How are you doing? Line <20> newline Line <20> newline Line <21> cbracketc } Line <21> newline Line <21> newline -Line <22> name Bob -Line <22> colon : -Line <22> string Testing... Line <22> newline Line <22> newline +Line <23> name Ryan +Line <23> colon : +Line <23> cbracketo { Line <23> newline Line <23> newline -Line <24> control -Line <24> string What do you want to do? -Line <24> cbracketo { +Line <24> string Hey Bob I'm good how are you? Line <24> newline Line <24> newline -Line <25> string option 1 -Line <25> name test2 -Line <25> parao ( -Line <25> string testing -Line <25> parac ) +Line <25> cbracketc } Line <25> newline Line <25> newline -Line <26> string option 2 -Line <26> jump -Line <26> string test +Line <26> name Bob +Line <26> colon : +Line <26> string Testing... Line <26> newline Line <26> newline -Line <27> string option 3 -Line <27> jump -Line <27> name there Line <27> newline Line <27> newline -Line <28> string option 4 -Line <28> gotoo -Line <28> string o3 +Line <28> control +Line <28> string What do you want to do? +Line <28> cbracketo { Line <28> newline Line <28> newline -Line <29> string option 5 -Line <29> gotoo -Line <29> name here +Line <29> string option 1 +Line <29> name test2 +Line <29> parao ( +Line <29> string testing +Line <29> seperator , +Line <29> cbracketo { +Line <29> number 1 +Line <29> seperator , +Line <29> number 2 +Line <29> seperator , +Line <29> number 3 +Line <29> cbracketc } +Line <29> parac ) Line <29> newline Line <29> newline -Line <30> string option 6 -Line <30> name test -Line <30> parao ( -Line <30> string here -Line <30> parac ) +Line <30> string option 2 +Line <30> jump +Line <30> string test Line <30> newline Line <30> newline -Line <31> cbracketc } +Line <31> string option 3 +Line <31> jump +Line <31> name there Line <31> newline Line <31> newline +Line <32> string option 4 +Line <32> gotoo +Line <32> string o3 Line <32> newline Line <32> newline -Line <33> bracketo [ -Line <33> name test -Line <33> bracketc ] +Line <33> string option 5 +Line <33> gotoo +Line <33> name here Line <33> newline Line <33> newline -Line <34> name Ryan -Line <34> colon : -Line <34> string We are here now! +Line <34> string option 6 +Line <34> name test +Line <34> parao ( +Line <34> string here +Line <34> parac ) Line <34> newline Line <34> newline -Line <35> string hehe +Line <35> cbracketc } Line <35> newline Line <35> newline Line <36> newline Line <36> newline Line <37> bracketo [ -Line <37> name Bob -Line <37> colon : -Line <37> name char +Line <37> name test Line <37> bracketc ] Line <37> newline Line <37> newline -Line <38> name fname -Line <38> equal = -Line <38> string Bob +Line <38> name Ryan +Line <38> colon : +Line <38> string We are here now! Line <38> newline Line <38> newline +Line <39> string hehe +Line <39> newline Line <39> newline -Line <40> name age -Line <40> equal = -Line <40> number .24 Line <40> newline Line <40> newline -Line <41> name money -Line <41> equal = -Line <41> number 100 +Line <41> bracketo [ +Line <41> name Bob +Line <41> colon : +Line <41> name char +Line <41> bracketc ] Line <41> newline Line <41> newline -Line <42> name excited -Line <42> colon : -Line <42> string path/to/file +Line <42> name fname +Line <42> equal = +Line <42> string Bob Line <42> newline Line <42> newline Line <43> newline -Line <43> newline -Line <44> bracketo [ -Line <44> name newblock -Line <44> colon : -Line <44> name function -Line <44> parao ( -Line <44> parac ) -Line <44> bracketc ] +Line <44> name age +Line <44> equal = +Line <44> number 0.24 Line <44> newline Line <44> newline -Line <45> string Test #2 +Line <45> name money +Line <45> equal = +Line <45> number 100 Line <45> newline Line <45> newline -Line <46> string Does it parse this part properly? +Line <46> name excited +Line <46> colon : +Line <46> string path/to/file Line <46> newline Line <46> newline -Line <47> string huh Line <47> newline Line <47> newline -Line <47> eof +Line <48> bracketo [ +Line <48> name newblock +Line <48> colon : +Line <48> name function +Line <48> parao ( +Line <48> parac ) +Line <48> bracketc ] +Line <48> newline +Line <48> newline +Line <49> string Test #2 +Line <49> newline +Line <49> newline +Line <50> string Does it parse this part properly? +Line <50> newline +Line <50> newline +Line <51> string huh +Line <51> newline +Line <51> newline +Line <51> eof Line <1> newline Line <1> newline Line <1> bracketo [ diff --git a/DMS/test.dms b/DMS/test.dms index 1150a56..cff9b7c 100644 --- a/DMS/test.dms +++ b/DMS/test.dms @@ -1,13 +1,17 @@ entry main // Will either start the first block seen or the block supplied by you! enable warnings disable omniscient +enable forseelabels //enable leaking -enable debugging +//enable debugging loadfile "loadtest.dms" version 1.2 using extendedDefine [main] + "why" + works = true + jump Bob "Testing" Bob: { speed 50 @@ -22,7 +26,7 @@ using extendedDefine Bob: "Testing..." choice "What do you want to do?" { - "option 1" test2("testing") + "option 1" test2("testing",{1,2,3}) "option 2" jump "test" "option 3" jump there "option 4" goto "o3" diff --git a/DMS/value.cpp b/DMS/value.cpp index b5f0a6f..69dda40 100644 --- a/DMS/value.cpp +++ b/DMS/value.cpp @@ -133,32 +133,17 @@ namespace dms { return temp.str(); } void dms_env::pushValue(value* val) { - double count = 0; - while (ipart[count++]->type != nil) {} - ipart.insert_or_assign(count-1, val); + ipart.push_back(val); } void dms_env::pushValue(value* ind, value* val) { - if (ind->type == number) { - size_t size = ipart.size(); - if (val->type == nil) { - ipart[ind->n->val]->nuke(); - ipart.erase(ind->n->val); - count--; - } - else { - ipart.insert_or_assign(ind->n->val, val); - count++; - } - } else { - if (val->type == nil) { - hpart[ind->toString()]->nuke(); - hpart.erase(ind->toString()); - count--; - } - else { - hpart.insert_or_assign(ind->toString(), val); - count++; - } + if (val->type == nil) { + hpart[ind->toString()]->nuke(); + hpart.erase(ind->toString()); + count--; + } + else { + hpart.insert_or_assign(ind->toString(), val); + count++; } } value* dms_env::getValue(value* ind) { diff --git a/DMS/value.h b/DMS/value.h index bf8ce07..f959438 100644 --- a/DMS/value.h +++ b/DMS/value.h @@ -137,7 +137,7 @@ namespace dms { struct dms_env { std::unordered_map hpart; - std::unordered_map ipart; + std::vector ipart; void pushValue(value* val); void pushValue(value* ind, value* val); value* getValue(value* val);