diff --git a/DMS/Debug/DMS.log b/DMS/Debug/DMS.log index 03034fa..bb5d7ce 100644 --- a/DMS/Debug/DMS.log +++ b/DMS/Debug/DMS.log @@ -1,2 +1,5 @@ - LineParser.cpp + DMS.cpp + LineParser.cpp + chunk.cpp + Generating Code... DMS.vcxproj -> C:\Users\Ryan\source\repos\DMS\Debug\DMS.exe diff --git a/DMS/Debug/DMS.obj b/DMS/Debug/DMS.obj index d34117d..a4750ef 100644 Binary files a/DMS/Debug/DMS.obj and b/DMS/Debug/DMS.obj differ diff --git a/DMS/Debug/DMS.tlog/CL.command.1.tlog b/DMS/Debug/DMS.tlog/CL.command.1.tlog index b7b9314..3ab4496 100644 Binary files a/DMS/Debug/DMS.tlog/CL.command.1.tlog and b/DMS/Debug/DMS.tlog/CL.command.1.tlog differ diff --git a/DMS/Debug/DMS.tlog/CL.read.1.tlog b/DMS/Debug/DMS.tlog/CL.read.1.tlog index 68da36c..78ce02d 100644 Binary files a/DMS/Debug/DMS.tlog/CL.read.1.tlog and b/DMS/Debug/DMS.tlog/CL.read.1.tlog differ diff --git a/DMS/Debug/DMS.tlog/CL.write.1.tlog b/DMS/Debug/DMS.tlog/CL.write.1.tlog index b63787c..33aa76a 100644 Binary files a/DMS/Debug/DMS.tlog/CL.write.1.tlog and b/DMS/Debug/DMS.tlog/CL.write.1.tlog differ diff --git a/DMS/Debug/LineParser.obj b/DMS/Debug/LineParser.obj index e2ca299..45acb0e 100644 Binary files a/DMS/Debug/LineParser.obj and b/DMS/Debug/LineParser.obj differ diff --git a/DMS/Debug/cmd.obj b/DMS/Debug/cmd.obj index f530845..bb111ea 100644 Binary files a/DMS/Debug/cmd.obj and b/DMS/Debug/cmd.obj differ diff --git a/DMS/Debug/codes.obj b/DMS/Debug/codes.obj index dcf882d..bcd2a60 100644 Binary files a/DMS/Debug/codes.obj and b/DMS/Debug/codes.obj differ diff --git a/DMS/Debug/number_utils.obj b/DMS/Debug/number_utils.obj index 260a4ce..8916631 100644 Binary files a/DMS/Debug/number_utils.obj and b/DMS/Debug/number_utils.obj differ diff --git a/DMS/Debug/utils.obj b/DMS/Debug/utils.obj index 6d3d20b..7a14ae0 100644 Binary files a/DMS/Debug/utils.obj and b/DMS/Debug/utils.obj differ diff --git a/DMS/Debug/value.obj b/DMS/Debug/value.obj index 9ea0786..a9532b2 100644 Binary files a/DMS/Debug/value.obj and b/DMS/Debug/value.obj differ diff --git a/DMS/Debug/vc142.idb b/DMS/Debug/vc142.idb index 709d09f..9747f8c 100644 Binary files a/DMS/Debug/vc142.idb and b/DMS/Debug/vc142.idb differ diff --git a/DMS/Debug/vc142.pdb b/DMS/Debug/vc142.pdb index bc3e133..1469155 100644 Binary files a/DMS/Debug/vc142.pdb and b/DMS/Debug/vc142.pdb differ diff --git a/DMS/LineParser.cpp b/DMS/LineParser.cpp index 9b5e473..a0fce9a 100644 --- a/DMS/LineParser.cpp +++ b/DMS/LineParser.cpp @@ -14,7 +14,7 @@ namespace dms { token tokenstream::peek() { return this->tokens[pos]; } - std::vector tokenstream::next(tokens::tokentype tk, size_t n) { + std::vector tokenstream::next(tokens::tokentype tk) { std::vector temp; while (peek().type!=tk) { temp.push_back(next()); @@ -86,16 +86,16 @@ namespace dms { return true; if (stream.tokens[stream.pos+i].type != types[i]) return false; - print(stream.tokens[stream.pos + i].type, " | ", types[i]); + //print(stream.tokens[stream.pos + i].type, " | ", types[i]); } return true; } - std::map LineParser::tokenizer(dms_state* state,std::vector &toks) { - std::map chunks; + std::map LineParser::tokenizer(dms_state* state,std::vector &toks) { + std::map chunks; chunk* current_chunk = nullptr; std::string chunk_name; blocktype chunk_type; - + size_t line=1; tokenstream stream; stream.init(&toks); token current = stream.next(); @@ -105,7 +105,7 @@ namespace dms { if (current.type == tokens::flag) { temp = stream.next(tokens::newline); if (temp.size() != 2) { - std::cout << ""; + std::cout << "Error"; } codes::op code = current.raw; tokens::tokentype tok = temp[0].type; @@ -129,49 +129,120 @@ namespace dms { } else { std::stringstream str; - str << "Expected " << " got: " << current << " "; - state->push_error(errors::error{errors::badtoken,str.str(),true,current.line_num}); + str << "Expected " << " got: " << current << temp[0]; + state->push_error(errors::error{errors::badtoken,str.str(),true,line}); } - std::cout << temp.size() << std::endl; - std::cout << temp[0] << std::endl; } - // To implement function we need to match stuff //Todo Finish the chunk data stuff if (match(stream,tokens::newline,tokens::bracketo,tokens::name,tokens::bracketc)) { stream.next(); - if (current_chunk != nullptr) - chunks.insert_or_assign(current_chunk->name, *current_chunk); - + if (current_chunk != nullptr) { + if (!chunks.count(current_chunk->name)) + chunks.insert_or_assign(current_chunk->name, current_chunk); + else + { + std::stringstream str; + str << "Block <" << current_chunk->name << "> already defined!"; + state->push_error(errors::error{ errors::block_already_defined,str.str(),true,line }); + } + } current_chunk = new chunk; - stream.next(); // Consume + chunk_type = bt_block; + line = stream.next().line_num; // Consume current_chunk->name = stream.next().name; stream.next(); // Consume } + // This handles a few block types since they all follow a similar format else if (match(stream, tokens::newline, tokens::bracketo, tokens::name,tokens::colon,tokens::name, tokens::bracketc)) { stream.next(); stream.next(); - if (current_chunk != nullptr) - chunks.insert_or_assign(current_chunk->name, *current_chunk); + if (current_chunk != nullptr) { + if (!chunks.count(current_chunk->name)) + chunks.insert_or_assign(current_chunk->name, current_chunk); + else + { + std::stringstream str; + str << "Block <" << current_chunk->name << "> already defined!"; + state->push_error(errors::error{ errors::block_already_defined,str.str(),true,line }); + } + } current_chunk = new chunk; current_chunk->name = stream.next().name; - stream.next(); + line = stream.next().line_num; std::string temp = stream.next().name; + // Characters are a feature I want to have intergrated into the language if (temp == "char") { current_chunk->type = bt_character; + chunk_type = bt_character; } + // Enviroments are sortof like objects, they can be uses as an object. They are a cleaner way to build a hash map like object else if (temp == "env") { current_chunk->type = bt_env; + chunk_type = bt_env; } + // Menus are what they say on the tin. They provide the framework for having menus within your game else if (temp == "menu") { current_chunk->type = bt_menu; + chunk_type = bt_menu; } stream.next(); } - wait(); + else if (match(stream, tokens::newline,tokens::bracketo,tokens::name,tokens::colon,tokens::name,tokens::parao)) { + std::stringstream str; + stream.next(); + stream.next(); + if (current_chunk != nullptr) { + if (!chunks.count(current_chunk->name)) + chunks.insert_or_assign(current_chunk->name, current_chunk); + else + { + std::stringstream str; + str << "Block <" << current_chunk->name << "> already defined!"; + state->push_error(errors::error{ errors::block_already_defined,str.str(),true,line }); + } + } + + current_chunk = new chunk; + current_chunk->name = stream.next().name; + line = stream.next().line_num; // The color, not needed after the inital match, but we still need to consume it + std::string b = stream.next().name; + if (b == "function") { + current_chunk->type = bt_method; // We have a method let's set the block type to that, but we aren't done yet + // We need to set the params if any so the method can be supplied with arguments + stream.next(); // parao + std::vector tokens = stream.next(tokens::parac); // Consume until we see parac + dms_args args; + for (size_t i = 0; i < tokens.size()-1; i++) {//The lase symbol is parac since that was the consume condition + if (tokens[i].type == tokens::name) { + // We got a name which is refering to a variable so lets build one + value v; + v.type = variable; // Special type, it writes data to the string portion, but is interperted as a lookup + v.s = buildString(tokens[i].name); + args.push(v); + } + else if (tokens[i].type == tokens::seperator) { + // We just ignore this + } + else { + std::stringstream str; + str << "Unexpected symbol: " << tokens[i]; + state->push_error(errors::error{errors::badtoken,str.str(),true,line }); + } + } + // If all went well the 'args' now has all of tha params for the method we will be working with + current_chunk->params = args; + // Thats should be all we need to do + } + else { + str << "'function' keyword expected got " << b; + state->push_error(errors::error{errors::badtoken, str.str(),true,line }); + } + } current = stream.next(); } + chunks.insert_or_assign(current_chunk->name, current_chunk); return chunks; } void LineParser::tolower(std::string &s1) { @@ -224,7 +295,7 @@ namespace dms { size_t line = 1; while (data != NULL) { if (data == '/' && stream.peek()=='/') { - line++; + //line++; stream.next('\n'); // Seek until you find a newline } else if (data == '\n') { @@ -398,6 +469,12 @@ namespace dms { else if (str == "choice") { t_vec.push_back(token{ tokens::control,codes::CHOI,"",line }); } + else if (str == "return") { + t_vec.push_back(token{ tokens::ret,codes::RETN,"",line }); + } + else if (str == "nil") { + t_vec.push_back(token{ tokens::nil,codes::NOOP,"",line }); + } else if (utils::isalphanum(str) && str.size()>0) { t_vec.push_back(token{ tokens::name,codes::NOOP,str,line }); } @@ -419,7 +496,8 @@ namespace dms { outputFile.close(); print("Running tokenizer"); // Tokens build let's parse - tokenizer(state, t_vec); + std::map test = tokenizer(state, t_vec); + print(test.size()); return state; } } \ No newline at end of file diff --git a/DMS/LineParser.h b/DMS/LineParser.h index 60a40b8..64d9259 100644 --- a/DMS/LineParser.h +++ b/DMS/LineParser.h @@ -21,7 +21,7 @@ namespace dms { void init(std::vector* ptr); tokens::token next(); tokens::token peek(); - std::vector next(tokens::tokentype tk, size_t n=0); + std::vector next(tokens::tokentype tk); }; struct passer { std::string stream; @@ -45,6 +45,6 @@ namespace dms { //Matches tokens from the stream, if the tokens match it will return true and YOU should call next on the stream. This method does not change the current position bool match(tokenstream stream, tokens::tokentype t1=tokens::none, tokens::tokentype t2 = tokens::none, tokens::tokentype t3 = tokens::none, tokens::tokentype t4 = tokens::none, tokens::tokentype t5 = tokens::none, tokens::tokentype t6 = tokens::none, tokens::tokentype t7 = tokens::none, tokens::tokentype t8 = tokens::none, tokens::tokentype t9 = tokens::none, tokens::tokentype t10 = tokens::none, tokens::tokentype t11 = tokens::none, tokens::tokentype t12 = tokens::none); void tolower(std::string &str); - std::map tokenizer(dms_state* state, std::vector &tok); + std::map tokenizer(dms_state* state, std::vector &tok); }; } \ No newline at end of file diff --git a/DMS/chunk.h b/DMS/chunk.h index 56e75aa..d154a67 100644 --- a/DMS/chunk.h +++ b/DMS/chunk.h @@ -12,9 +12,11 @@ namespace dms { struct chunk { blocktype type = bt_block; + dms_args params; std::string name = ""; std::vector cmds = std::vector(); size_t pos = 0; + size_t line = 0; void addCmd(cmd c); }; } diff --git a/DMS/codes.cpp b/DMS/codes.cpp index 5e573f1..40e25e1 100644 --- a/DMS/codes.cpp +++ b/DMS/codes.cpp @@ -1,3 +1,3 @@ #pragma once #include "Codes.h" -const std::string dms::codes::list[] = { "NOOP","ENTR","ENAB","DISA","LOAD","VERN","USIN","STAT","DISP","ASGN","LABL","CHOI","OPTN","FORE","????","WHLE","FNWR","FNNR","IFFF","ELIF","ELSE","DEFN","SKIP","COMP","INDX","JMPZ","INST","ERRO" }; \ No newline at end of file +const std::string dms::codes::list[] = { "NOOP","ENTR","ENAB","DISA","LOAD","VERN","USIN","STAT","DISP","ASGN","LABL","CHOI","OPTN","FORE","????","WHLE","FNWR","FNNR","IFFF","ELIF","ELSE","DEFN","SKIP","COMP","INDX","JMPZ","INST","ERRO" ,"RETN" }; \ No newline at end of file diff --git a/DMS/codes.h b/DMS/codes.h index ee2462d..26b340b 100644 --- a/DMS/codes.h +++ b/DMS/codes.h @@ -30,7 +30,8 @@ namespace dms::codes { INDX, JMPZ, INST, - ERRO + ERRO, + RETN }; extern const std::string list[]; static bool isControl(const op code) { diff --git a/DMS/dms_state.cpp b/DMS/dms_state.cpp index 9f4d712..83d770a 100644 --- a/DMS/dms_state.cpp +++ b/DMS/dms_state.cpp @@ -1 +1,12 @@ #include "dms_state.h" +namespace dms { + void dms_state::push_error(errors::error err) { + std::cout << err.err_msg << " On Line <" << err.linenum << ">" << std::endl; + if(err.crash) + std::exit(err.code); + } + void dms_state::push_warning(errors::error err) { + err.crash = false; // Force code to not crash then push the error + push_error(err); + } +} \ No newline at end of file diff --git a/DMS/dms_state.h b/DMS/dms_state.h index 389ca5a..627f246 100644 --- a/DMS/dms_state.h +++ b/DMS/dms_state.h @@ -2,11 +2,13 @@ #include #include "errors.h" #include +#include namespace dms { class dms_state { public: - void push_error(errors::error err) {}; + void push_error(errors::error err); + void push_warning(errors::error err); double version=1.0; std::string entry = "start"; std::map enables; diff --git a/DMS/dump.txt b/DMS/dump.txt index 412fecd..5c0aede 100644 --- a/DMS/dump.txt +++ b/DMS/dump.txt @@ -5,193 +5,207 @@ Line <1>NOOP newline Line <2>ENAB flag Line <2>NOOP name warnings Line <2>NOOP newline +Line <3>NOOP newline Line <4>NOOP newline +Line <5>VERN flag +Line <5>NOOP number 1.2 +Line <5>NOOP newline +Line <6>USIN flag +Line <6>NOOP name extendedDefine Line <6>NOOP newline -Line <7>VERN flag -Line <7>NOOP number 1.2 Line <7>NOOP newline -Line <8>USIN flag -Line <8>NOOP name extendedDefine +Line <8>NOOP bracketo +Line <8>NOOP name Ryan +Line <8>NOOP colon +Line <8>NOOP name char +Line <8>NOOP bracketc Line <8>NOOP newline +Line <9>NOOP tab +Line <9>NOOP name name +Line <9>NOOP equal +Line <9>NOOP string Ryan Line <9>NOOP newline -Line <10>NOOP bracketo -Line <10>NOOP name Ryan -Line <10>NOOP colon -Line <10>NOOP name char -Line <10>NOOP bracketc -Line <10>NOOP cbracketo +Line <10>NOOP tab +Line <10>NOOP name age +Line <10>NOOP equal +Line <10>NOOP number 21 Line <10>NOOP newline -Line <11>NOOP tab -Line <11>NOOP name name -Line <11>NOOP equal -Line <11>NOOP string Ryan Line <11>NOOP newline -Line <12>NOOP tab -Line <12>NOOP name age -Line <12>NOOP equal -Line <12>NOOP number 21 +Line <12>NOOP bracketo +Line <12>NOOP name step +Line <12>NOOP colon +Line <12>NOOP name function +Line <12>NOOP parao +Line <12>NOOP name a +Line <12>NOOP seperator +Line <12>NOOP name b +Line <12>NOOP seperator +Line <12>NOOP name c +Line <12>NOOP parac +Line <12>NOOP bracketc Line <12>NOOP newline -Line <13>NOOP cbracketc +Line <13>NOOP tab +Line <13>NOOP string Testing... Line <13>NOOP newline +Line <14>NOOP tab +Line <14>NOOP name d +Line <14>NOOP equal +Line <14>NOOP parao +Line <14>NOOP name 100 +Line <14>NOOP number +Line <14>NOOP plus +Line <14>NOOP name b +Line <14>NOOP parac +Line <14>NOOP divide +Line <14>NOOP name c +Line <14>NOOP name nil Line <14>NOOP newline -Line <15>NOOP bracketo -Line <15>NOOP name main -Line <15>NOOP bracketc +Line <15>NOOP tab +Line <15>RETN ret +Line <15>NOOP name d Line <15>NOOP newline -Line <16>NOOP tab -Line <16>NOOP string This works! Line <16>NOOP newline -Line <17>NOOP tab -Line <17>NOOP string What's up +Line <17>NOOP bracketo +Line <17>NOOP name main +Line <17>NOOP bracketc Line <17>NOOP newline +Line <18>NOOP tab +Line <18>NOOP string This works! Line <18>NOOP newline Line <19>NOOP tab -Line <19>NOOP name ryan -Line <19>NOOP string Hello "how" are you doing? +Line <19>NOOP string What's up +Line <19>NOOP newline Line <20>NOOP newline Line <21>NOOP tab -Line <21>NOOP name bob -Line <21>NOOP string I'm good you? +Line <21>NOOP name ryan +Line <21>NOOP string Hello "how" are you doing? Line <21>NOOP newline Line <22>NOOP tab +Line <22>NOOP name bob +Line <22>NOOP string I'm good you? Line <22>NOOP newline Line <23>NOOP tab -Line <23>NOOP name tester -Line <23>NOOP equal -Line <23>NOOP string Hello Line <23>NOOP newline Line <24>NOOP tab +Line <24>NOOP name tester +Line <24>NOOP equal +Line <24>NOOP string Hello Line <24>NOOP newline Line <25>NOOP tab -Line <25>NOOP name food -Line <25>NOOP equal -Line <25>NOOP number 3 Line <25>NOOP newline Line <26>NOOP tab +Line <26>NOOP name food +Line <26>NOOP equal +Line <26>NOOP number 3 Line <26>NOOP newline Line <27>NOOP tab -Line <27>NOOP name hi -Line <27>NOOP equal -Line <27>NOOP cbracketo -Line <27>NOOP number 1 -Line <27>NOOP seperator -Line <27>NOOP number 2 -Line <27>NOOP seperator -Line <27>NOOP number 3 -Line <27>NOOP cbracketc Line <27>NOOP newline +Line <28>NOOP tab +Line <28>NOOP name hi +Line <28>NOOP equal +Line <28>NOOP cbracketo +Line <28>NOOP number 1 +Line <28>NOOP seperator +Line <28>NOOP number 2 +Line <28>NOOP seperator +Line <28>NOOP number 3 +Line <28>NOOP cbracketc Line <28>NOOP newline -Line <29>NOOP tab -Line <29>NOOP name list -Line <29>NOOP seperator -Line <29>NOOP name test -Line <29>NOOP equal -Line <29>NOOP cbracketo -Line <29>NOOP cbracketo -Line <29>NOOP number 1 -Line <29>NOOP seperator -Line <29>NOOP number 2 -Line <29>NOOP plus -Line <29>NOOP name food -Line <29>NOOP seperator -Line <29>NOOP name hi -Line <29>NOOP bracketo -Line <29>NOOP number 3 -Line <29>NOOP bracketc -Line <29>NOOP cbracketc -Line <29>NOOP seperator -Line <29>NOOP name true -Line <29>NOOP seperator -Line <29>NOOP name tester -Line <29>NOOP seperator -Line <29>NOOP number 123 -Line <29>NOOP seperator -Line <29>NOOP string This is a string! -Line <29>NOOP seperator -Line <29>NOOP name false -Line <29>NOOP seperator -Line <29>NOOP cbracketo -Line <29>NOOP number 3 -Line <29>NOOP seperator -Line <29>NOOP number 2 -Line <29>NOOP seperator -Line <29>NOOP number 1 -Line <29>NOOP cbracketc -Line <29>NOOP cbracketc -Line <29>NOOP seperator -Line <29>NOOP number 5 Line <29>NOOP newline Line <30>NOOP tab -Line <30>NOOP name a -Line <30>NOOP equal Line <30>NOOP name list -Line <30>NOOP bracketo +Line <30>NOOP seperator +Line <30>NOOP name test +Line <30>NOOP equal +Line <30>NOOP cbracketo +Line <30>NOOP cbracketo Line <30>NOOP number 1 +Line <30>NOOP seperator +Line <30>NOOP number 2 +Line <30>NOOP plus +Line <30>NOOP name food +Line <30>NOOP seperator +Line <30>NOOP name hi +Line <30>NOOP bracketo +Line <30>NOOP number 3 Line <30>NOOP bracketc +Line <30>NOOP cbracketc +Line <30>NOOP seperator +Line <30>NOOP name true +Line <30>NOOP seperator +Line <30>NOOP name tester +Line <30>NOOP seperator +Line <30>NOOP number 123 +Line <30>NOOP seperator +Line <30>NOOP string This is a string! +Line <30>NOOP seperator +Line <30>NOOP name false +Line <30>NOOP seperator +Line <30>NOOP cbracketo +Line <30>NOOP number 3 +Line <30>NOOP seperator +Line <30>NOOP number 2 +Line <30>NOOP seperator +Line <30>NOOP number 1 +Line <30>NOOP cbracketc +Line <30>NOOP cbracketc +Line <30>NOOP seperator +Line <30>NOOP number 5 Line <30>NOOP newline +Line <31>NOOP tab +Line <31>NOOP name a +Line <31>NOOP equal +Line <31>NOOP name list +Line <31>NOOP bracketo +Line <31>NOOP number 1 +Line <31>NOOP bracketc Line <31>NOOP newline -Line <32>NOOP tab -Line <32>NOOP name hungry -Line <32>NOOP equal -Line <32>NOOP parao -Line <32>NOOP minus -Line <32>NOOP number 2 -Line <32>NOOP plus -Line <32>NOOP number 4 -Line <32>NOOP minus -Line <32>NOOP parao -Line <32>NOOP parao -Line <32>NOOP number 5 -Line <32>NOOP multiply -Line <32>NOOP number 5 -Line <32>NOOP parac -Line <32>NOOP divide -Line <32>NOOP name sqrt -Line <32>NOOP parao -Line <32>NOOP number 144 -Line <32>NOOP plus -Line <32>NOOP number 5 -Line <32>NOOP parac -Line <32>NOOP parac -Line <32>NOOP parac -Line <32>NOOP pow -Line <32>NOOP number 2 -Line <32>NOOP multiply -Line <32>NOOP number 2 -Line <32>NOOP plus -Line <32>NOOP number 2 Line <32>NOOP newline Line <33>NOOP tab -Line <33>NOOP name list -Line <33>NOOP bracketo -Line <33>NOOP number 1 -Line <33>NOOP bracketc +Line <33>NOOP name hungry Line <33>NOOP equal -Line <33>NOOP string Hello +Line <33>NOOP parao +Line <33>NOOP minus +Line <33>NOOP number 2 +Line <33>NOOP plus +Line <33>NOOP number 4 +Line <33>NOOP minus +Line <33>NOOP parao +Line <33>NOOP parao +Line <33>NOOP number 5 +Line <33>NOOP multiply +Line <33>NOOP number 5 +Line <33>NOOP parac +Line <33>NOOP divide +Line <33>NOOP name sqrt +Line <33>NOOP parao +Line <33>NOOP number 144 +Line <33>NOOP plus +Line <33>NOOP number 5 +Line <33>NOOP parac +Line <33>NOOP parac +Line <33>NOOP parac +Line <33>NOOP pow +Line <33>NOOP number 2 +Line <33>NOOP multiply +Line <33>NOOP number 2 +Line <33>NOOP plus +Line <33>NOOP number 2 Line <33>NOOP newline Line <34>NOOP tab -Line <34>NOOP number var1 -Line <34>NOOP seperator -Line <34>NOOP name var2 -Line <34>NOOP number -Line <34>NOOP equal -Line <34>NOOP name func -Line <34>NOOP parao +Line <34>NOOP name list +Line <34>NOOP bracketo Line <34>NOOP number 1 -Line <34>NOOP seperator -Line <34>NOOP string string -Line <34>NOOP seperator -Line <34>NOOP number 2 -Line <34>NOOP plus -Line <34>NOOP number 5 -Line <34>NOOP parac +Line <34>NOOP bracketc +Line <34>NOOP equal +Line <34>NOOP string Hello Line <34>NOOP newline Line <35>NOOP tab -Line <35>NOOP name a -Line <35>NOOP equal -Line <35>NOOP name 100 +Line <35>NOOP number var1 +Line <35>NOOP seperator +Line <35>NOOP name var2 Line <35>NOOP number -Line <35>NOOP plus +Line <35>NOOP equal Line <35>NOOP name func Line <35>NOOP parao Line <35>NOOP number 1 @@ -202,10 +216,13 @@ Line <35>NOOP number 2 Line <35>NOOP plus Line <35>NOOP number 5 Line <35>NOOP parac -Line <35>NOOP plus -Line <35>NOOP number 100 Line <35>NOOP newline Line <36>NOOP tab +Line <36>NOOP name a +Line <36>NOOP equal +Line <36>NOOP name 100 +Line <36>NOOP number +Line <36>NOOP plus Line <36>NOOP name func Line <36>NOOP parao Line <36>NOOP number 1 @@ -216,11 +233,25 @@ Line <36>NOOP number 2 Line <36>NOOP plus Line <36>NOOP number 5 Line <36>NOOP parac +Line <36>NOOP plus +Line <36>NOOP number 100 Line <36>NOOP newline Line <37>NOOP tab -Line <37>NOOP label label +Line <37>NOOP name func +Line <37>NOOP parao +Line <37>NOOP number 1 +Line <37>NOOP seperator +Line <37>NOOP string string +Line <37>NOOP seperator +Line <37>NOOP number 2 +Line <37>NOOP plus +Line <37>NOOP number 5 +Line <37>NOOP parac Line <37>NOOP newline Line <38>NOOP tab +Line <38>NOOP label label +Line <38>NOOP newline +Line <39>NOOP tab Line <39>NOOP newline Line <40>NOOP tab Line <40>NOOP newline diff --git a/DMS/errors.h b/DMS/errors.h index b4e9d74..10b42b5 100644 --- a/DMS/errors.h +++ b/DMS/errors.h @@ -7,7 +7,8 @@ namespace dms::errors { invalid_arguments, invalie_type, array_out_of_bounds, - badtoken + badtoken, + block_already_defined }; struct error { errortype code=unknown; diff --git a/DMS/test.dms b/DMS/test.dms index ce2394b..9d4f1c8 100644 --- a/DMS/test.dms +++ b/DMS/test.dms @@ -5,10 +5,14 @@ enable warnings version 1.2 using extendedDefine -[Ryan:char]{ +[Ryan:char] name = "Ryan" age = 21 -} + +[step:function(a,b,c)] + "Testing..." + d = (100 + b) / c nil + return d [main] "This works!" diff --git a/DMS/token.h b/DMS/token.h index feaf268..562c13c 100644 --- a/DMS/token.h +++ b/DMS/token.h @@ -35,7 +35,9 @@ namespace dms::tokens { label, newline, tab, - eof + eof, + ret, + nil };//stream, t_vec, line, isNum, buffer struct token { tokentype type = noop; @@ -89,7 +91,9 @@ namespace dms::tokens { "label", "newline", "tab", - "eof" + "eof", + "ret", + "nil" }; out << "Line <" << c.line_num << ">" << codes::list[c.raw] << " " << temp1[c.type] << " \t\t " << c.name; return out; diff --git a/DMS/value.cpp b/DMS/value.cpp index a99fc19..5f13136 100644 --- a/DMS/value.cpp +++ b/DMS/value.cpp @@ -5,6 +5,9 @@ #include #include namespace dms { + void dms_args::push(value val) { + args.push_back(val); + } dms_string* buildString(std::string str) { size_t len = str.length(); uint8_t* arr = new uint8_t[len]; @@ -22,7 +25,7 @@ namespace dms { dms_number* dms_num = new dms_number{ num }; return dms_num; } - std::string value::toString() { + std::string value::toString() const { std::stringstream temp; temp << this; return temp.str(); @@ -47,6 +50,18 @@ namespace dms { val->set(buildBool(b)); return val; } + void value::nuke() { + delete[] s; + delete[] b; + delete[] n; + delete[] e; + delete[] c; + s = nullptr; + b = nullptr; + n = nullptr; + e = nullptr; + c = nullptr; + } bool value::typeMatch(const value o) const { return type == o.type; } diff --git a/DMS/value.h b/DMS/value.h index ccfc024..8677ebf 100644 --- a/DMS/value.h +++ b/DMS/value.h @@ -6,7 +6,7 @@ namespace dms { struct dms_env; - enum datatypes { nil, number, boolean, env, string, custom }; + enum datatypes { nil, number, boolean, env, string, custom, variable }; struct dms_number { double val; double getValue() { return val; } @@ -47,13 +47,14 @@ namespace dms { dms_string* s = nullptr; dms_env* e = nullptr; dms_custom* c = nullptr; + void nuke(); void set(dms_string* str); void set(dms_boolean* bo); void set(dms_number* num); void set(dms_env* en); void set(); bool typeMatch(const value o) const; - std::string toString(); + std::string toString() const; friend bool operator<(const value& l, const value& r) { if (l.typeMatch(r)) { @@ -84,6 +85,9 @@ namespace dms { else if (c.type == custom) { out << "Custom Data: " << c; } + else if (c.type == variable) { + out << c.s->getValue(); // Do the lookup + } return out; }; }; @@ -94,6 +98,16 @@ namespace dms { struct dms_args { std::vector args; + void push(value val); + friend std::ostream& operator << (std::ostream& out, const dms_args& c) { + for (size_t i=0; i < c.args.size(); i++) { + if(i==c.args.size()-1) + out << c.args[i]; + else + out << c.args[i] << ", "; + } + return out; + } }; struct dms_env { diff --git a/Debug/DMS.exe b/Debug/DMS.exe index f2f8829..71d27ca 100644 Binary files a/Debug/DMS.exe and b/Debug/DMS.exe differ diff --git a/Debug/DMS.ilk b/Debug/DMS.ilk index 4ed976c..cd3013e 100644 Binary files a/Debug/DMS.ilk and b/Debug/DMS.ilk differ diff --git a/Debug/DMS.pdb b/Debug/DMS.pdb index 71dcf18..1b0f1de 100644 Binary files a/Debug/DMS.pdb and b/Debug/DMS.pdb differ