diff --git a/DMS/DMS.cpp b/DMS/DMS.cpp index 8b717ce..75dca8f 100644 --- a/DMS/DMS.cpp +++ b/DMS/DMS.cpp @@ -4,20 +4,31 @@ //#include "utils.h" #include #include "value.h" +#include using namespace dms; using namespace utils; //typedef void(*FNPTR)(); - +using namespace std::chrono; value invokeTest(void* self, dms_state* state, dms_args* args) { utils::print(args->args[0].getPrintable()); return "I work!"; } +value print(void* self, dms_state* state, dms_args* args) { + for (size_t i = 0; i < args->size()-1; i++) + std::cout << args->args[i].getPrintable() << '\t'; + std::cout << std::endl; + return value(); +} int main() { - + /*milliseconds ms = duration_cast( + system_clock::now().time_since_epoch() + ); + utils::print(ms.count());*/ LineParser parser = LineParser("test.dms"); dms_state* state = parser.Parse(); state->invoker.registerFunction("invokeTest", invokeTest); + state->invoker.registerFunction("print", print); state->dump(); state->run(); diff --git a/DMS/DMS.vcxproj b/DMS/DMS.vcxproj index a678815..45f7b75 100644 --- a/DMS/DMS.vcxproj +++ b/DMS/DMS.vcxproj @@ -169,6 +169,7 @@ + diff --git a/DMS/DMS.vcxproj.filters b/DMS/DMS.vcxproj.filters index a9f7896..0fd0b1f 100644 --- a/DMS/DMS.vcxproj.filters +++ b/DMS/DMS.vcxproj.filters @@ -140,5 +140,8 @@ Source Files\DMS + + Header Files\DMS + \ No newline at end of file diff --git a/DMS/Invoker.cpp b/DMS/Invoker.cpp index ee4058d..dbda6f9 100644 --- a/DMS/Invoker.cpp +++ b/DMS/Invoker.cpp @@ -24,7 +24,7 @@ namespace dms { return funcs[str](self, state, args); } state->push_error(errors::error{ errors::non_existing_function, utils::concat("Attempt to call '",str,"' a nil value!") }); - return nullptr; + return value(datatypes::error); } std::unordered_map Invoker::Export() { return funcs; diff --git a/DMS/LineParser.h b/DMS/LineParser.h index baf1178..dd1e02c 100644 --- a/DMS/LineParser.h +++ b/DMS/LineParser.h @@ -14,6 +14,7 @@ #include "token.h" #include "utils.h" #include "errors.h" +#include "comparisons.h" namespace dms { struct tokenstream { @@ -76,6 +77,8 @@ namespace dms { bool match_process_standard(tokenstream* stream, value& v); // All types that are matchable are handled here! bool match_process_index(tokenstream* stream,value& v, bool leftside = false); bool match_process_return(tokenstream* stream); + bool match_process_condition(tokenstream* stream, value& v); + bool match_process_if(tokenstream* stream); // Build void buildGoto(std::string g, bool v = false); diff --git a/DMS/LineParserMatchProcess.cpp b/DMS/LineParserMatchProcess.cpp index 5ac2c27..d788cc8 100644 --- a/DMS/LineParserMatchProcess.cpp +++ b/DMS/LineParserMatchProcess.cpp @@ -5,43 +5,53 @@ using namespace dms::utils; namespace dms { bool LineParser::match_process_standard(tokenstream* stream, value& v) { if (match_process_expression(stream, v)) { + match_process_condition(stream,v); return true; } else if (match_process_function(stream, v)) { + match_process_condition(stream, v); return true; } else if (match_process_list(stream, v)) { + match_process_condition(stream, v); return true; } else if (match_process_index(stream, v)) { + match_process_condition(stream, v); return true; } else if (stream->match(tokens::True)) { - v.set(buildBool(true)); + v.set(true); stream->next(); + match_process_condition(stream, v); return true; } else if (stream->match(tokens::False)) { - v.set(buildBool(false)); + v.set(false); stream->next(); + match_process_condition(stream, v); return true; } else if (stream->match(tokens::number)) { v.set(std::stod(stream->next().name)); + match_process_condition(stream, v); return true; } else if (stream->match(tokens::string)) { v.set(buildString(stream->next().name)); + match_process_condition(stream, v); return true; } else if (stream->match(tokens::name)) { v.set(buildString(stream->next().name)); v.type = datatypes::variable; + match_process_condition(stream, v); return true; } else if (stream->match(tokens::nil)) { stream->next(); v.set(); + match_process_condition(stream, v); return true; } else if (stream->match(tokens::bracketo, tokens::name, tokens::bracketc)) { @@ -50,6 +60,7 @@ namespace dms { v.set(buildString(stream->next().name)); v.type = datatypes::block; stream->next(); + match_process_condition(stream, v); return true; } else if (stream->match(tokens::newline)) { @@ -57,6 +68,76 @@ namespace dms { } return false; } + bool LineParser::match_process_condition(tokenstream* stream, value& v) { + // This has taken way too long, but there exists only a few places where this needs to be interjected + // The reference to v needs some work if we have a comparison! + // First we need to get a copy of v store it somewhere do the comparision and convert v into a variable that points to the output of the comparison + + comp cmp; + // We only need to see if one of these conditions are true + //== + if (stream->match(tokens::equal,tokens::equal)) { + cmp = comp::eq; + stream->next(); + stream->next(); + } + //<= + else if (stream->match(tokens::anglebracketO, tokens::equal)) { + cmp = comp::lteq; + stream->next(); + stream->next(); + } + //>= + else if (stream->match(tokens::anglebracketC, tokens::equal)) { + cmp = comp::gteq; + stream->next(); + stream->next(); + } + //!= + else if (stream->match(tokens::exclamation, tokens::equal)) { + cmp = comp::nteq; + stream->next(); + stream->next(); + } + //< + else if (stream->match(tokens::anglebracketO)) { + cmp = comp::lt; + stream->next(); + } + //> + else if (stream->match(tokens::anglebracketC)) { + cmp = comp::gt; + stream->next(); + } + else { + return false; + } + // So if all is good we continue here + value right = value(datatypes::variable); + value left = v; + value var = value(datatypes::variable); + // COMP cmp out v1 v2 + if (match_process_standard(stream,right)) { + v.set(buildString(var.s->getValue())); + v.type = datatypes::variable; + cmd* c = new cmd; + c->opcode = codes::COMP; + c->args.push(value((double)cmp)); + c->args.push(var); + c->args.push(left); + c->args.push(right); + current_chunk->addCmd(c); + return true; + } + else { + badSymbol(stream); + return false; + } + } + //Covers if, elseif, else + bool LineParser::match_process_if(tokenstream* stream) { + return false; + } bool LineParser::match_process_list(tokenstream* stream, value& v) { if (stream->match(tokens::cbracketo)) { token start = stream->peek(); @@ -557,7 +638,7 @@ namespace dms { if (tempstream.match(tokens::seperator)) { // We have a seperator for function arguments tempstream.next(); // Consume it - } + } else if (match_process_standard(&tempstream, tempval)) { c->args.push(tempval); } diff --git a/DMS/LineParserParse.cpp b/DMS/LineParserParse.cpp index 61dffec..3a0d4aa 100644 --- a/DMS/LineParserParse.cpp +++ b/DMS/LineParserParse.cpp @@ -231,6 +231,14 @@ namespace dms { doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer); t_vec.push_back(token{ tokens::ampersand,codes::NOOP,"&",line }); } + else if (data == '>') { + doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer); + t_vec.push_back(token{ tokens::anglebracketC,codes::NOOP,">",line }); + } + else if (data == '>') { + doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer); + t_vec.push_back(token{ tokens::anglebracketO,codes::NOOP,"<",line }); + } else if (data == '\t') { doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer); t_vec.push_back(token{ tokens::tab,codes::NOOP,"\t",line }); @@ -377,6 +385,10 @@ namespace dms { flagcmd = new cmd; } else if (code == codes::ENTR && tok == tokens::name) { + if (state->entry != "$undefined") { + state->push_error(errors::error{ errors::unknown ,utils::concat("Entrypoint already defined as '",state->entry,"'. Trying to redefine as '",temp[0].name,"' is not allowed!"), true,stream->last().line_num,current_chunk }); + return; + } state->entry = temp[0].name; flagcmd->opcode = code; flagcmd->args.push(value(temp[0].name)); @@ -411,6 +423,7 @@ namespace dms { } else { state->push_error(errors::error{ errors::badtoken,concat("Expected got: ", current, temp[0]),true,line,current_chunk }); + return; } } // Default block @@ -470,6 +483,8 @@ namespace dms { std::stringstream str; str << "Unexpected symbol: " << tokens[i]; state->push_error(errors::error{ errors::badtoken,str.str(),true,line,current_chunk }); + + return; } } // If all went well the 'args' now has all of tha params for the method we will be working with @@ -479,6 +494,8 @@ namespace dms { else { str << "'function' keyword expected got " << b; state->push_error(errors::error{ errors::badtoken, str.str(),true,line,current_chunk }); + + return; } } // Control Handle all controls here diff --git a/DMS/character.cpp b/DMS/character.cpp index 215f2ed..ac87602 100644 --- a/DMS/character.cpp +++ b/DMS/character.cpp @@ -18,7 +18,7 @@ namespace dms { if (has("nickname")) { return values["nickname"].getPrintable(); } - if (seen && has("fname") && has("lname")) { + if (seen && has("fname") && has("lname") && fullname) { return utils::concat(values["fname"].getPrintable()," ", values["lname"].getPrintable()); } else if (seen && has("fname")) { diff --git a/DMS/comparisons.h b/DMS/comparisons.h new file mode 100644 index 0000000..3087676 --- /dev/null +++ b/DMS/comparisons.h @@ -0,0 +1,11 @@ +#pragma once +namespace dms { + enum comp { + eq, + gteq, + lteq, + nteq, + lt, + gt + }; +} \ No newline at end of file diff --git a/DMS/dms_state.cpp b/DMS/dms_state.cpp index ba7f20d..5b39204 100644 --- a/DMS/dms_state.cpp +++ b/DMS/dms_state.cpp @@ -2,7 +2,7 @@ #include "Handlers.h" namespace dms { void dms_state::init() { - if (init_init) + if (init_init || stop) return; init_init = true; cmd* c = new cmd; @@ -37,6 +37,9 @@ namespace dms { void dms_state::pushMem() { mem_stack.push(memory()); } + void dms_state::pushMem(memory &mem) { + mem_stack.push(mem); + } void dms_state::popMem() { mem_stack.pop(); } diff --git a/DMS/dms_state.h b/DMS/dms_state.h index 3be610a..eab0cfc 100644 --- a/DMS/dms_state.h +++ b/DMS/dms_state.h @@ -12,11 +12,13 @@ #include "memory.h" #include #include "dms_list.h" +#include "comparisons.h" namespace dms { struct Handler; value blockInvoke(void*, dms_state*, dms_args*); struct dms_state { + friend class LineParser; Handler* handler = nullptr; bool hasFirst = false; Invoker invoker; @@ -74,6 +76,7 @@ namespace dms { private: // From what I gathered //std::mutex memory_mutex; + void pushMem(memory&); bool stop = false; bool init_init = false; void init(chunk* chunk, size_t &pos,size_t &max, std::vector& cmds); diff --git a/DMS/dms_state_interpret.cpp b/DMS/dms_state_interpret.cpp index a8e9260..477b891 100644 --- a/DMS/dms_state_interpret.cpp +++ b/DMS/dms_state_interpret.cpp @@ -11,20 +11,6 @@ namespace dms { void dms_state::setHandler(Handler* hand) { this->handler = hand; } - void checkCharacter(character* cc,std::string index, datatypes type) { - value val = cc->get(index); - // If a type mismatch is present, overwrite them with the defaults - if (val.type!=type) { - if (type == datatypes::string) - cc->values[index] = value(""); - else if (type == datatypes::boolean) { - cc->values[index] = value(false); - } - else if (type == datatypes::number) { - cc->values[index] = value(0); - } - } - } enviroment* dms_state::getEnvironment(std::string env) { if (environments.count(env)) { return environments[env]; @@ -46,6 +32,20 @@ namespace dms { } return nullptr; } + void checkCharacter(character* cha, std::string index, datatypes type) { + auto val = cha->values[index]; + // If a type mismatch is present, overwrite them with the defaults + if (val.type != type) { + if (type == datatypes::string) + cha->values[index] = value(""); + else if (type == datatypes::boolean) { + cha->values[index] = value(false); + } + else if (type == datatypes::number) { + cha->values[index] = value(0); + } + } + } character* dms_state::getCharacter(std::string cha) { if (characters.count(cha)) { characters[cha]->seen = true; @@ -53,12 +53,13 @@ namespace dms { } else { if (blockExists(cha)) { + pushMem(); character* cc = new character; cc->fullname = isEnabled("fullname"); - cc->set("fname", cha); + /*cc->set("fname", cha); cc->set("lname", ""); cc->set("unknown", "Unknown"); - cc->set("known", false); + cc->set("known", false);*/ if (isEnabled("omniscient")) { cc->seen = true; } @@ -66,20 +67,25 @@ namespace dms { cc->seen = false; } if (run(cha,&cc->values)) { + cc->values = *getMem(); checkCharacter(cc, "fname",datatypes::string); - checkCharacter(cc, "lname", datatypes::string); + if (cc->get("fname") == value("")) { + cc->set("fname",value(cha)); + } checkCharacter(cc, "unknown", datatypes::string); checkCharacter(cc, "known", datatypes::boolean); - if (cc->get("known").b == true) { + if (cc->get("known").b) { cc->seen = true; } } else { + popMem(); return nullptr; } characters.insert_or_assign(cha, cc); // Call Character event! handler->OnSpeakerCreated(this,cc); + popMem(); return cc; } else { @@ -108,6 +114,8 @@ namespace dms { return true; } bool dms_state::run() { + if (stop) + return false; if (chunks[entry] == NULL) { push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block [",entry,"]") }); return false; @@ -226,6 +234,8 @@ namespace dms { else if (environmentExists(obj)) { ret = getEnvironment(obj)->Invoke(funcname, this, &args); } + if (ret.type == datatypes::error) + return false; if (assn.type != datatypes::nil) { assign(assn, ret); } @@ -248,6 +258,8 @@ namespace dms { else { ret = invoker.Invoke(funcname, this, &args); } + if (ret.type == datatypes::error) + return false; if (assn.type != datatypes::nil) { assign(assn, ret); } @@ -385,9 +397,43 @@ namespace dms { list.e->pushValue(c->args.args[1]); } break; + case COMP: + { + comp cmp = (comp)c->args.args[0].n; + value assn = c->args.args[1]; + value left = c->args.args[2].resolve(this); + value right = c->args.args[3].resolve(this); + switch (cmp) { + case comp::eq: { + assign(assn, value(left == right)); + break; + } + case comp::gt: { + assign(assn, value(left > right)); + break; + } + case comp::gteq: { + assign(assn, value(left >= right)); + break; + } + case comp::lt: { + assign(assn, value(left < right)); + break; + } + case comp::lteq: { + assign(assn, value(left <= right)); + break; + } + case comp::nteq: { + assign(assn, value(left != right)); + break; + } + } + } + break; case HALT: //wait(); - sleep(700); + //sleep(700); std::cout << std::endl; break; case WAIT: diff --git a/DMS/dump.bin b/DMS/dump.bin index 9606fda..2f83e36 100644 Binary files a/DMS/dump.bin and b/DMS/dump.bin differ diff --git a/DMS/dump.txt b/DMS/dump.txt index f4fd55e..1fa6e0c 100644 --- a/DMS/dump.txt +++ b/DMS/dump.txt @@ -10,26 +10,28 @@ Line <3> name omniscient Line <3> newline Line <3> newline Line <4> flag -Line <4> name forwardlabels +Line <4> name fullname +Line <4> newline Line <4> newline Line <5> flag -Line <5> name savestate -Line <5> newline +Line <5> name forwardlabels Line <5> newline +Line <6> flag +Line <6> name savestate +Line <6> newline Line <6> newline Line <7> newline -Line <8> flag -Line <8> string loadtest.dms -Line <8> newline Line <8> newline Line <9> flag -Line <9> number 0.2 +Line <9> string loadtest.dms Line <9> newline Line <9> newline Line <10> flag -Line <10> name extendedDefine +Line <10> number 0.2 Line <10> newline Line <10> newline +Line <11> flag +Line <11> name extendedDefine Line <11> newline Line <11> newline Line <12> bracketo [ @@ -44,98 +46,112 @@ Line <13> newline Line <13> newline Line <14> name Bob Line <14> colon : -Line <14> string Hi `Ryan`, I'm good. +Line <14> string Hi `Ryan`, I'm good, I'm Bob by the way. Line <14> newline Line <14> newline -Line <15> name a -Line <15> equal = -Line <15> number 1000 +Line <15> name Ryan +Line <15> colon : +Line <15> string Oh so your name is `Bob`, nice to meet you! Line <15> newline Line <15> newline -Line <16> name imp +Line <16> name a Line <16> equal = -Line <16> string this +Line <16> number 1000 Line <16> newline Line <16> newline -Line <17> name test +Line <17> name imp Line <17> equal = -Line <17> name invokeTest -Line <17> parao ( -Line <17> string Running external code! -Line <17> parac ) +Line <17> string this Line <17> newline Line <17> newline -Line <17> newline -Line <18> string Loop Test... `test` +Line <18> name print +Line <18> parao ( +Line <18> string Hello +Line <18> seperator , +Line <18> number 122 +Line <18> equal = +Line <18> equal = +Line <18> number 123 +Line <18> parac ) Line <18> newline Line <18> newline -Line <19> control -Line <19> string Pick one -Line <19> cbracketo { +Line <19> name test +Line <19> equal = +Line <19> name invokeTest +Line <19> parao ( +Line <19> string Running external code! +Line <19> parac ) Line <19> newline Line <19> newline -Line <20> string this -Line <20> gotoo -Line <20> name imp +Line <19> newline +Line <20> string Loop Test... `test` Line <20> newline Line <20> newline -Line <21> string that -Line <21> gotoo -Line <21> parao ( -Line <21> string that -Line <21> parac ) +Line <21> control +Line <21> string Pick one +Line <21> cbracketo { Line <21> newline Line <21> newline -Line <22> cbracketc } +Line <22> string this +Line <22> gotoo +Line <22> name imp Line <22> newline Line <22> newline -Line <23> label this +Line <23> string that +Line <23> gotoo +Line <23> parao ( +Line <23> string that +Line <23> parac ) Line <23> newline Line <23> newline -Line <24> string At "this" +Line <24> cbracketc } Line <24> newline Line <24> newline -Line <25> gotoo -Line <25> parao ( -Line <25> string loop -Line <25> parac ) +Line <25> flag +Line <25> name test Line <25> newline Line <25> newline -Line <26> label that +Line <26> label this Line <26> newline Line <26> newline -Line <27> string At "that" +Line <27> string At "this" Line <27> newline Line <27> newline -Line <28> label loop +Line <28> gotoo +Line <28> string loop Line <28> newline Line <28> newline -Line <29> name a -Line <29> equal = -Line <29> name a -Line <29> plus + -Line <29> number 1 +Line <29> label that Line <29> newline Line <29> newline -Line <30> string a = `a` +Line <30> string At "that" Line <30> newline Line <30> newline -Line <31> gotoo -Line <31> parao ( -Line <31> string loop -Line <31> parac ) +Line <31> label loop Line <31> newline Line <31> newline +Line <32> name a +Line <32> equal = +Line <32> name a +Line <32> plus + +Line <32> number 1 Line <32> newline Line <32> newline +Line <33> string a = `a` Line <33> newline Line <33> newline +Line <34> gotoo +Line <34> parao ( +Line <34> string loop +Line <34> parac ) +Line <34> newline Line <34> newline Line <35> newline Line <35> newline Line <36> newline +Line <36> newline Line <37> newline -Line <37> newline +Line <38> newline Line <38> newline Line <39> newline Line <39> newline @@ -145,83 +161,89 @@ Line <41> newline Line <42> newline Line <43> newline Line <43> newline -Line <44> bracketo [ -Line <44> name Bob -Line <44> colon : -Line <44> name char -Line <44> bracketc ] -Line <44> newline Line <44> newline Line <45> newline +Line <45> newline Line <46> newline Line <47> newline -Line <48> name unknown -Line <48> equal = -Line <48> string Some Random Guy +Line <47> newline +Line <48> bracketo [ +Line <48> name Bob +Line <48> colon : +Line <48> name char +Line <48> bracketc ] Line <48> newline Line <48> newline -Line <49> name age -Line <49> equal = -Line <49> number 0.24 Line <49> newline -Line <49> newline -Line <50> name money -Line <50> equal = -Line <50> number 100 Line <50> newline -Line <50> newline -Line <51> name excited -Line <51> colon : -Line <51> string path/to/file -Line <51> newline Line <51> newline +Line <52> name unknown +Line <52> equal = +Line <52> string Some Random Guy Line <52> newline Line <52> newline -Line <53> bracketo [ -Line <53> name test1 -Line <53> colon : -Line <53> name function -Line <53> parao ( -Line <53> parac ) -Line <53> bracketc ] +Line <53> name age +Line <53> equal = +Line <53> number 0.24 Line <53> newline Line <53> newline -Line <54> string Inside a function! +Line <54> name money +Line <54> equal = +Line <54> number 100 Line <54> newline Line <54> newline +Line <55> name excited +Line <55> colon : +Line <55> string path/to/file +Line <55> newline Line <55> newline Line <56> newline +Line <56> newline +Line <57> bracketo [ +Line <57> name test1 +Line <57> colon : +Line <57> name function +Line <57> parao ( +Line <57> parac ) +Line <57> bracketc ] Line <57> newline Line <57> newline -Line <58> bracketo [ -Line <58> name newblock -Line <58> colon : -Line <58> name function -Line <58> parao ( -Line <58> name a -Line <58> seperator , -Line <58> name b -Line <58> seperator , -Line <58> name c -Line <58> parac ) -Line <58> bracketc ] +Line <58> string Inside a function! Line <58> newline Line <58> newline -Line <59> string Func Arguments: a = `a`, b = `b`, c = `c` Line <59> newline -Line <59> newline -Line <60> string Time to return Line <60> newline -Line <60> newline -Line <61> ret -Line <61> name a -Line <61> plus + -Line <61> name b -Line <61> plus + -Line <61> name c Line <61> newline Line <61> newline -Line <61> eof +Line <62> bracketo [ +Line <62> name newblock +Line <62> colon : +Line <62> name function +Line <62> parao ( +Line <62> name a +Line <62> seperator , +Line <62> name b +Line <62> seperator , +Line <62> name c +Line <62> parac ) +Line <62> bracketc ] +Line <62> newline +Line <62> newline +Line <63> string Func Arguments: a = `a`, b = `b`, c = `c` +Line <63> newline +Line <63> newline +Line <64> string Time to return +Line <64> newline +Line <64> newline +Line <65> ret +Line <65> name a +Line <65> plus + +Line <65> name b +Line <65> plus + +Line <65> name c +Line <65> newline +Line <65> newline +Line <65> eof Line <1> newline Line <1> newline Line <1> bracketo [ diff --git a/DMS/test.dms b/DMS/test.dms index c4bf942..8002b9e 100644 --- a/DMS/test.dms +++ b/DMS/test.dms @@ -1,6 +1,7 @@ entry main // Will either start the first block seen or the block supplied by you! //enable warnings disable omniscient +enable fullname enable forwardlabels // Do most of your labels exist ahead? enable savestate //enable leaking @@ -8,18 +9,20 @@ enable savestate loadfile "loadtest.dms" version 0.2 using extendedDefine - [main] Ryan: "Hello `Bob`, how are you doing?" - Bob: "Hi `Ryan`, I'm good." + Bob: "Hi `Ryan`, I'm good, I'm Bob by the way." + Ryan: "Oh so your name is `Bob`, nice to meet you!" a = 1000 imp = "this" + print("Hello",122==123) test = invokeTest("Running external code!"); "Loop Test... `test`" choice "Pick one" { "this" goto imp "that" goto ("that") } + enable test ::this:: "At \"this\"" goto "loop" @@ -31,16 +34,16 @@ using extendedDefine goto ("loop") - if (this==that) this()|that() + // if (this==that) this()|that() - if(this == that){ + // if(this == that){ - } else if (that > this) { + // } elseif (that > this) { - } else { + // } else { - } + // } [Bob:char] //fname = "Bob" diff --git a/DMS/token.h b/DMS/token.h index 1004c60..7725a2d 100644 --- a/DMS/token.h +++ b/DMS/token.h @@ -50,6 +50,8 @@ namespace dms::tokens { ampersand, nil, pipe, + anglebracketO, + anglebracketC, };//stream, t_vec, line, isNum, buffer struct token { tokentype type = noop; @@ -121,7 +123,9 @@ namespace dms::tokens { "dollar", "ampersand", "nil", - "pipe" + "pipe", + "anglebracketO", + "anglebracketC", }; out << "Line <" << c.line_num << "> " << tokenlist[c.type] << " \t\t " << c.name; return out; diff --git a/DMS/value.cpp b/DMS/value.cpp index 5d08976..ab9e16d 100644 --- a/DMS/value.cpp +++ b/DMS/value.cpp @@ -52,7 +52,7 @@ namespace dms { s = buildString(other.s->val); break; case datatypes::boolean: - b = buildBool(other.b); + b = other.b; break; case datatypes::custom: // Handle this later @@ -200,6 +200,30 @@ namespace dms { bool operator!=(const value& lhs, const value& rhs) { return !(lhs.getPrintable() == rhs.getPrintable()); } + bool operator>(const value& lhs, const value& rhs) { + if (lhs.type == datatypes::number && rhs.type == datatypes::number) { + return lhs.n > rhs.n; + } + return false; + } + bool operator<(const value& lhs, const value& rhs) { + if (lhs.type == datatypes::number && rhs.type == datatypes::number) { + return lhs.n < rhs.n; + } + return false; + } + bool operator>=(const value& lhs, const value& rhs) { + if (lhs.type == datatypes::number && rhs.type == datatypes::number) { + return lhs.n >= rhs.n; + } + return false; + } + bool operator<=(const value& lhs, const value& rhs) { + if (lhs.type == datatypes::number && rhs.type == datatypes::number) { + return lhs.n <= rhs.n; + } + return false; + } value value::resolve(dms_state* state) { if (type == datatypes::variable && (*this)!=(*state->getMem())[getPrintable()]) { return (*state->getMem())[getPrintable()].resolve(state); @@ -364,9 +388,6 @@ namespace dms { dms_string* dms_str = new dms_string{ newstr.str() }; return dms_str; } - dms_boolean* buildBool(bool b) { - return new dms_boolean{b}; - } std::string value::toString() const { std::stringstream temp; temp << this; diff --git a/DMS/value.h b/DMS/value.h index 8f9db2b..1dc8ffa 100644 --- a/DMS/value.h +++ b/DMS/value.h @@ -51,7 +51,6 @@ namespace dms { value* self; }; dms_string* buildString(std::string str); - dms_boolean* buildBool(bool b); struct value { public: datatypes type = datatypes::nil; @@ -75,11 +74,16 @@ namespace dms { value& operator=(value& other); value& operator=(const value& other); friend bool operator==(const value& lhs, const value& rhs); + friend bool operator!=(const value& lhs, const value& rhs); + friend bool operator>(const value& lhs, const value& rhs); + friend bool operator<(const value& lhs, const value& rhs); + friend bool operator>=(const value& lhs, const value& rhs); + friend bool operator<=(const value& lhs, const value& rhs); + friend value operator+(const value& lhs, const value& rhs); friend value operator-(const value& lhs, const value& rhs); friend value operator/(const value& lhs, const value& rhs); friend value operator*(const value& lhs, const value& rhs); - friend bool operator!=(const value& lhs, const value& rhs); value resolve(dms_state*); void nuke(); void set(value*);