diff --git a/DMS/DMS.vcxproj b/DMS/DMS.vcxproj
index f508590..b86a06e 100644
--- a/DMS/DMS.vcxproj
+++ b/DMS/DMS.vcxproj
@@ -118,6 +118,7 @@
true
_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
+ stdcpp17
Console
diff --git a/DMS/LineParser.cpp b/DMS/LineParser.cpp
index 30c4544..cd58498 100644
--- a/DMS/LineParser.cpp
+++ b/DMS/LineParser.cpp
@@ -11,6 +11,9 @@ namespace dms {
return token{ tokentype::noop,codes::NOOP,"EOF",0 };
return this->tokens[pos++];
}
+ void tokenstream::prev() {
+ pos--;
+ }
std::vector tokenstream::next(tokentype to, tokentype tc) {
std::vector tok;
size_t open = 0;
@@ -70,6 +73,12 @@ namespace dms {
std::string passer::processBuffer(std::vector buf) {
return std::string(buf.begin(), buf.end());
}
+ bool LineParser::isBlock() {
+ return isBlock(bt_block); // Default block type
+ }
+ bool LineParser::isBlock(blocktype bk_type) {
+ return current_chunk->type == bk_type;
+ }
void doCheck(passer* stream,std::vector* t_vec, size_t line, bool &isNum, bool &hasDec, std::vector* buffer) {
std::string str = stream->processBuffer(*buffer);
if (utils::isNum(str) && isNum) {
@@ -166,24 +175,33 @@ namespace dms {
//
return false;
}
- std::map LineParser::tokenizer(dms_state* state,std::vector &toks) {
- std::map chunks;
- chunk* current_chunk = nullptr;
- std::string chunk_name;
- blocktype chunk_type = bt_block;
- std::stack scopes;
- size_t line=1;
- tokenstream stream;
- stream.init(&toks);
+ bool LineParser::createBlock(std::string bk_name, blocktype bk_type) {
+ 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 });
+ return false;
+ }
+ }
+ current_chunk = new chunk;
+ current_chunk->name = bk_name;
+ chunk_type = bk_type;
+ current_chunk->type = bk_type;
+ print("Created Block: ",bk_name," <",bk_type,">");
+ }
+ void LineParser::_Parse(tokenstream stream) {
token current = stream.next();
- std::vector temp;
- size_t tabs = 0;
while (stream.peek().type != tokens::eof) {
print(current);
if (current.type == tokens::tab)
tabs++;
if (current.type == tokens::flag) {
temp = stream.next(tokens::newline);
+ stream.prev(); // Unconsume the newline piece
if (temp.size() != 2) {
std::cout << "Error";
}
@@ -191,7 +209,7 @@ namespace dms {
tokens::tokentype tok = temp[0].type;
if (code == codes::ENAB && tok == tokens::name) {
tolower(temp[0].name);
- state->enables.insert_or_assign(temp[0].name,true);
+ state->enables.insert_or_assign(temp[0].name, true);
}
else if (code == codes::ENTR && tok == tokens::name) {
state->entry = temp[0].name;
@@ -204,7 +222,7 @@ namespace dms {
state->version = std::stod(temp[0].name);
}
else if (code == codes::USIN && tok == tokens::name) {
- // TODO add usings, kinda useless since everything will be packed in. Perhaps extensions might work
+ // TODO add usings, kinda useless atm since everything will be packed in. Perhaps extensions?
}
else if (code == codes::LOAD && tok == tokens::string) {
Parse(state, temp[0].name); // Load another file
@@ -212,89 +230,53 @@ namespace dms {
else {
std::stringstream str;
str << "Expected " << " got: " << current << temp[0];
- state->push_error(errors::error{errors::badtoken,str.str(),true,line});
+ state->push_error(errors::error{ errors::badtoken,str.str(),true,line });
}
}
- if (stream.match(tokens::newline,tokens::bracketo,tokens::name,tokens::bracketc)) {
+ // Default block
+ if (stream.match(tokens::newline, tokens::bracketo, tokens::name, tokens::bracketc)) {
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;
- chunk_type = bt_block;
+ std::string name = stream.next().name;
+ createBlock(name,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 (stream.match(tokens::newline, tokens::bracketo, tokens::name,tokens::colon,tokens::name, tokens::bracketc)) {
+ else if (stream.match(tokens::newline, tokens::bracketo, tokens::name, tokens::colon, tokens::name, tokens::bracketc)) {
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;
+ std::string name = stream.next().name;
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;
+ createBlock(name, 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;
+ createBlock(name, 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;
+ createBlock(name, bt_menu);
}
stream.next();
}
- else if (stream.match(tokens::newline,tokens::bracketo,tokens::name,tokens::colon,tokens::name,tokens::parao)) {
+ // Function block type
+ else if (stream.match(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;
+ std::string 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
+ createBlock(name, 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
+ 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 = new value{};
@@ -308,7 +290,7 @@ namespace dms {
else {
std::stringstream str;
str << "Unexpected symbol: " << tokens[i];
- state->push_error(errors::error{errors::badtoken,str.str(),true,line });
+ 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
@@ -317,22 +299,22 @@ namespace dms {
}
else {
str << "'function' keyword expected got " << b;
- state->push_error(errors::error{errors::badtoken, str.str(),true,line });
+ state->push_error(errors::error{ errors::badtoken, str.str(),true,line });
}
}
// Control Handle all controls here
- if (stream.match(tokens::tab,tokens::control)) {
+ if (stream.match(tokens::tab, tokens::control)) {
stream.next(); // Standard consumption
token control = stream.next();
- if (control.raw == codes::CHOI && stream.peek().type==tokens::string) {
+ if (control.raw == codes::CHOI && stream.peek().type == tokens::string) {
// Let's parse choice blocks.
std::string prompt = stream.next().name;
- print("Prompt: ",prompt);
+ print("Prompt: ", prompt);
bool good = true;
size_t c = 0;
while (good) {
// We need to template the matches
- if (stream.match(tokens::tab,tokens::string,tokens::name,tokens::parao)) {
+ if (stream.match(tokens::tab, tokens::string, tokens::name, tokens::parao)) {
stream.next();
std::string prompt = stream.next().name;
@@ -341,7 +323,7 @@ namespace dms {
// We just grabbed the prompt, we don't yet know how many choices we have. So we have to figure out how we can
// Process and write the bytecode for this.
std::string func = stream.next().name;
- print("Choice: <",c,"> ",prompt," Funcname: ",func);
+ print("Choice: <", c, "> ", prompt, " Funcname: ", func);
std::vector funcstuff = stream.next(tokens::newline);
//We need to process the function data and finish creating
@@ -375,7 +357,7 @@ namespace dms {
std::string name = stream.next().name;
stream.next(); // That colon
std::string msg = stream.next().name;
- print("DISP := ", name , " says '",msg,"'");
+ print("DISP := ", name, " says '", msg, "'");
// We might have to consume a newline... Depends on what's next
if (stream.hasScope(tabs)) {
// If true we might have a group of displaying stuff.
@@ -394,11 +376,15 @@ namespace dms {
wait();
}*/
if (current.type != tokens::tab)
- tabs=0;
+ tabs = 0;
current = stream.next();
}
chunks.insert_or_assign(current_chunk->name, current_chunk);
- return chunks;
+ }
+ void LineParser::tokenizer(dms_state* state,std::vector &toks) {
+ stream.init(&toks);
+ this->state = state; // Grab the pointer to the state and store it within the parser object
+ _Parse(stream);
}
void LineParser::tolower(std::string &s1) {
std::transform(s1.begin(), s1.end(), s1.begin(), std::tolower);
@@ -576,7 +562,6 @@ namespace dms {
if (data == ' ' && !isStr) { // tokens end with a space
std::string str = stream.processBuffer(buffer);
tolower(str);
- print("> ",str);
if (str == "enable") {
t_vec.push_back(token{ tokens::flag,codes::ENAB,"",line });
} else if (str == "entry") {
@@ -658,8 +643,7 @@ namespace dms {
outputFile.close();
print("Running tokenizer");
// Tokens build let's parse
- std::map test = tokenizer(state, t_vec);
- print(test.size());
+ tokenizer(state, t_vec);
return state;
}
}
\ No newline at end of file
diff --git a/DMS/LineParser.h b/DMS/LineParser.h
index ebb34a3..046c846 100644
--- a/DMS/LineParser.h
+++ b/DMS/LineParser.h
@@ -22,6 +22,7 @@ namespace dms {
size_t pos = 0;
void init(std::vector* ptr);
tokens::token next();
+ void prev();
std::vector next(tokens::tokentype to,tokens::tokentype tc);
tokens::token peek();
std::vector next(tokens::tokentype tk);
@@ -42,6 +43,18 @@ namespace dms {
class LineParser
{
std::string fn;
+ std::map chunks;
+ chunk* current_chunk = nullptr;
+ std::string chunk_name;
+ blocktype chunk_type = bt_block;
+ std::stack scopes;
+ size_t line = 1;
+ tokenstream stream;
+ std::vector temp;
+ size_t tabs = 0;
+ dms_state* state;
+
+ void _Parse(tokenstream stream);
public:
dms_state* Parse();
dms_state* Parse(std::string l);
@@ -50,6 +63,7 @@ namespace dms {
LineParser();
//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 createBlock(std::string bk_name, blocktype bk_type);
bool buildLabel(chunk c, std::string label);
bool processFunc(tokenstream stream, chunk c);
@@ -57,9 +71,13 @@ namespace dms {
bool processExpr(tokenstream stream, chunk c);
bool processLogic(tokenstream stream, chunk c);
+ //Utils
+ bool isBlock();
+ bool isBlock(blocktype bk_type);
+
void tolower(std::string &str);
tokens::tokentype* expr();
tokens::tokentype* variable();
- std::map tokenizer(dms_state* state, std::vector &tok);
+ void tokenizer(dms_state* state, std::vector &tok);
};
}
\ No newline at end of file
diff --git a/DMS/dump.txt b/DMS/dump.txt
index 2908e3a..cacbe11 100644
--- a/DMS/dump.txt
+++ b/DMS/dump.txt
@@ -165,6 +165,7 @@ Line <35>NOOP newline
Line <36>NOOP bracketo
Line <36>NOOP name main
Line <36>NOOP bracketc
+Line <36>NOOP cbracketo
Line <36>NOOP newline
Line <37>NOOP tab
Line <37>NOOP name Ryan
@@ -178,6 +179,7 @@ Line <38>NOOP newline
Line <39>NOOP tab
Line <39>NOOP name Ryan
Line <39>NOOP colon
+Line <39>NOOP cbracketo
Line <39>NOOP newline
Line <40>NOOP tab
Line <40>NOOP tab
@@ -204,147 +206,103 @@ Line <44>NOOP tab
Line <44>NOOP tab
Line <44>NOOP newline
Line <45>NOOP tab
-Line <45>NOOP tab
+Line <45>NOOP cbracketc
Line <45>NOOP newline
Line <46>NOOP tab
-Line <46>NOOP name tester
-Line <46>NOOP equal
-Line <46>NOOP string Hello
Line <46>NOOP newline
Line <47>NOOP tab
-Line <47>NOOP name food
+Line <47>NOOP name tester
Line <47>NOOP equal
-Line <47>NOOP number 3
+Line <47>NOOP string Hello
Line <47>NOOP newline
Line <48>NOOP tab
-Line <48>NOOP name a
+Line <48>NOOP name food
Line <48>NOOP equal
-Line <48>NOOP name list
-Line <48>NOOP bracketo
-Line <48>NOOP number 1
-Line <48>NOOP bracketc
+Line <48>NOOP number 3
Line <48>NOOP newline
+Line <49>NOOP tab
+Line <49>NOOP name a
+Line <49>NOOP equal
+Line <49>NOOP name list
+Line <49>NOOP bracketo
+Line <49>NOOP number 1
+Line <49>NOOP bracketc
Line <49>NOOP newline
Line <50>NOOP tab
-Line <50>NOOP name hungry
-Line <50>NOOP equal
-Line <50>NOOP parao
-Line <50>NOOP minus
-Line <50>NOOP number 2
-Line <50>NOOP plus
-Line <50>NOOP number 4
-Line <50>NOOP minus
-Line <50>NOOP parao
-Line <50>NOOP parao
-Line <50>NOOP number 5
-Line <50>NOOP multiply
-Line <50>NOOP number 5
-Line <50>NOOP parac
-Line <50>NOOP divide
-Line <50>NOOP name sqrt
-Line <50>NOOP parao
-Line <50>NOOP number 144
-Line <50>NOOP plus
-Line <50>NOOP number 5
-Line <50>NOOP parac
-Line <50>NOOP parac
-Line <50>NOOP parac
-Line <50>NOOP pow
-Line <50>NOOP number 2
-Line <50>NOOP multiply
-Line <50>NOOP number 2
-Line <50>NOOP plus
-Line <50>NOOP number 2
Line <50>NOOP newline
Line <51>NOOP tab
-Line <51>NOOP name list
-Line <51>NOOP bracketo
-Line <51>NOOP number 1
-Line <51>NOOP bracketc
-Line <51>NOOP equal
-Line <51>NOOP string Hello
+Line <51>IFFF control
+Line <51>NOOP name statment
+Line <51>NOOP cbracketo
Line <51>NOOP newline
Line <52>NOOP tab
-Line <52>NOOP name var1
-Line <52>NOOP number
-Line <52>NOOP equal
-Line <52>NOOP name func
-Line <52>NOOP parao
-Line <52>NOOP number 1
-Line <52>NOOP seperator
-Line <52>NOOP string string
-Line <52>NOOP seperator
-Line <52>NOOP number 2
-Line <52>NOOP plus
-Line <52>NOOP number 5
-Line <52>NOOP parac
+Line <52>NOOP tab
+Line <52>NOOP string test
Line <52>NOOP newline
Line <53>NOOP tab
-Line <53>NOOP name a
-Line <53>NOOP equal
-Line <53>NOOP name 100
-Line <53>NOOP number
-Line <53>NOOP plus
-Line <53>NOOP name func
-Line <53>NOOP parao
-Line <53>NOOP number 1
-Line <53>NOOP seperator
-Line <53>NOOP string string
-Line <53>NOOP seperator
-Line <53>NOOP number 2
-Line <53>NOOP plus
-Line <53>NOOP number 5
-Line <53>NOOP parac
-Line <53>NOOP plus
-Line <53>NOOP number 100
+Line <53>NOOP cbracketc
+Line <53>ELIF control
+Line <53>NOOP name statement
+Line <53>NOOP cbracketo
Line <53>NOOP newline
Line <54>NOOP tab
-Line <54>NOOP name func
-Line <54>NOOP parao
-Line <54>NOOP number 1
-Line <54>NOOP seperator
-Line <54>NOOP string string
-Line <54>NOOP seperator
-Line <54>NOOP number 2
-Line <54>NOOP plus
-Line <54>NOOP number 5
-Line <54>NOOP parac
+Line <54>NOOP tab
+Line <54>NOOP string test
Line <54>NOOP newline
Line <55>NOOP tab
-Line <55>NOOP label label
+Line <55>NOOP tab
+Line <55>NOOP cbracketc
+Line <55>IFFF control
+Line <55>NOOP name statement
+Line <55>NOOP cbracketo
Line <55>NOOP newline
Line <56>NOOP tab
+Line <56>NOOP tab
+Line <56>NOOP tab
+Line <56>NOOP string test
Line <56>NOOP newline
Line <57>NOOP tab
+Line <57>NOOP tab
+Line <57>NOOP tab
+Line <57>NOOP string test
Line <57>NOOP newline
Line <58>NOOP tab
+Line <58>NOOP tab
+Line <58>NOOP tab
Line <58>IFFF control
-Line <58>NOOP name statment
-Line <58>NOOP name then
+Line <58>NOOP name statement
+Line <58>NOOP cbracketo
Line <58>NOOP newline
Line <59>NOOP tab
Line <59>NOOP tab
+Line <59>NOOP tab
+Line <59>NOOP tab
Line <59>NOOP string test
Line <59>NOOP newline
Line <60>NOOP tab
-Line <60>ELIF control
-Line <60>NOOP name statement
-Line <60>NOOP name then
+Line <60>NOOP tab
+Line <60>NOOP tab
+Line <60>NOOP cbracketc
+Line <60>ELSE control
+Line <60>NOOP cbracketo
Line <60>NOOP newline
Line <61>NOOP tab
Line <61>NOOP tab
+Line <61>NOOP tab
+Line <61>NOOP tab
Line <61>NOOP string test
Line <61>NOOP newline
Line <62>NOOP tab
Line <62>NOOP tab
-Line <62>IFFF control
-Line <62>NOOP name statement
-Line <62>NOOP name then
+Line <62>NOOP tab
+Line <62>NOOP cbracketc
Line <62>NOOP newline
Line <63>NOOP tab
Line <63>NOOP tab
-Line <63>NOOP tab
-Line <63>NOOP string test
+Line <63>NOOP cbracketc
+Line <63>ELIF control
+Line <63>NOOP name statement
+Line <63>NOOP cbracketo
Line <63>NOOP newline
Line <64>NOOP tab
Line <64>NOOP tab
@@ -353,150 +311,216 @@ Line <64>NOOP string test
Line <64>NOOP newline
Line <65>NOOP tab
Line <65>NOOP tab
-Line <65>NOOP tab
-Line <65>IFFF control
-Line <65>NOOP name statement
-Line <65>NOOP name then
+Line <65>NOOP cbracketc
+Line <65>ELSE control
+Line <65>NOOP cbracketo
Line <65>NOOP newline
Line <66>NOOP tab
Line <66>NOOP tab
Line <66>NOOP tab
-Line <66>NOOP tab
Line <66>NOOP string test
Line <66>NOOP newline
Line <67>NOOP tab
Line <67>NOOP tab
-Line <67>NOOP tab
-Line <67>NOOP name else
+Line <67>NOOP cbracketc
Line <67>NOOP newline
Line <68>NOOP tab
-Line <68>NOOP tab
-Line <68>NOOP tab
-Line <68>NOOP tab
-Line <68>NOOP string test
Line <68>NOOP newline
Line <69>NOOP tab
-Line <69>NOOP tab
-Line <69>ELIF control
-Line <69>NOOP name statement
-Line <69>NOOP name then
+Line <69>NOOP gotoo
+Line <69>NOOP string somewhere
Line <69>NOOP newline
Line <70>NOOP tab
-Line <70>NOOP tab
-Line <70>NOOP tab
-Line <70>NOOP string test
+Line <70>NOOP jump
+Line <70>NOOP string overhere
Line <70>NOOP newline
-Line <71>NOOP tab
-Line <71>NOOP name else
Line <71>NOOP newline
Line <72>NOOP tab
-Line <72>NOOP tab
-Line <72>NOOP string test
+Line <72>NOOP name hungry
+Line <72>NOOP equal
+Line <72>NOOP parao
+Line <72>NOOP minus
+Line <72>NOOP number 2
+Line <72>NOOP plus
+Line <72>NOOP number 4
+Line <72>NOOP minus
+Line <72>NOOP parao
+Line <72>NOOP parao
+Line <72>NOOP number 5
+Line <72>NOOP multiply
+Line <72>NOOP number 5
+Line <72>NOOP parac
+Line <72>NOOP divide
+Line <72>NOOP name sqrt
+Line <72>NOOP parao
+Line <72>NOOP number 144
+Line <72>NOOP plus
+Line <72>NOOP number 5
+Line <72>NOOP parac
+Line <72>NOOP parac
+Line <72>NOOP parac
+Line <72>NOOP pow
+Line <72>NOOP number 2
+Line <72>NOOP multiply
+Line <72>NOOP number 2
+Line <72>NOOP plus
+Line <72>NOOP number 2
Line <72>NOOP newline
Line <73>NOOP tab
+Line <73>NOOP name list
+Line <73>NOOP bracketo
+Line <73>NOOP number 1
+Line <73>NOOP bracketc
+Line <73>NOOP equal
+Line <73>NOOP string Hello
Line <73>NOOP newline
Line <74>NOOP tab
-Line <74>NOOP gotoo
-Line <74>NOOP string somewhere
+Line <74>NOOP name var1
+Line <74>NOOP number
+Line <74>NOOP equal
+Line <74>NOOP name func
+Line <74>NOOP parao
+Line <74>NOOP number 1
+Line <74>NOOP seperator
+Line <74>NOOP string string
+Line <74>NOOP seperator
+Line <74>NOOP number 2
+Line <74>NOOP plus
+Line <74>NOOP number 5
+Line <74>NOOP parac
Line <74>NOOP newline
Line <75>NOOP tab
-Line <75>NOOP jump
-Line <75>NOOP string overhere
+Line <75>NOOP name a
+Line <75>NOOP equal
+Line <75>NOOP name 100
+Line <75>NOOP number
+Line <75>NOOP plus
+Line <75>NOOP name func
+Line <75>NOOP parao
+Line <75>NOOP number 1
+Line <75>NOOP seperator
+Line <75>NOOP string string
+Line <75>NOOP seperator
+Line <75>NOOP number 2
+Line <75>NOOP plus
+Line <75>NOOP number 5
+Line <75>NOOP parac
+Line <75>NOOP plus
+Line <75>NOOP number 100
Line <75>NOOP newline
Line <76>NOOP tab
+Line <76>NOOP name func
+Line <76>NOOP parao
+Line <76>NOOP number 1
+Line <76>NOOP seperator
+Line <76>NOOP string string
+Line <76>NOOP seperator
+Line <76>NOOP number 2
+Line <76>NOOP plus
+Line <76>NOOP number 5
+Line <76>NOOP parac
Line <76>NOOP newline
Line <77>NOOP tab
-Line <77>CHOI control
-Line <77>NOOP string Pick one:
-Line <77>NOOP cbracketo
+Line <77>NOOP label label
Line <77>NOOP newline
Line <78>NOOP tab
-Line <78>NOOP tab
-Line <78>NOOP string first
-Line <78>NOOP name func
-Line <78>NOOP parao
-Line <78>NOOP parac
Line <78>NOOP newline
Line <79>NOOP tab
-Line <79>NOOP tab
-Line <79>NOOP string second
-Line <79>NOOP name func
-Line <79>NOOP parao
-Line <79>NOOP parac
Line <79>NOOP newline
Line <80>NOOP tab
-Line <80>NOOP tab
-Line <80>NOOP string third
-Line <80>NOOP name func
-Line <80>NOOP parao
-Line <80>NOOP parac
+Line <80>CHOI control
+Line <80>NOOP string Pick one:
+Line <80>NOOP cbracketo
Line <80>NOOP newline
Line <81>NOOP tab
Line <81>NOOP tab
-Line <81>NOOP string forth
+Line <81>NOOP string first
Line <81>NOOP name func
Line <81>NOOP parao
Line <81>NOOP parac
Line <81>NOOP newline
Line <82>NOOP tab
Line <82>NOOP tab
-Line <82>NOOP string fifth
-Line <82>NOOP gotoo
-Line <82>NOOP string here
+Line <82>NOOP string second
+Line <82>NOOP name func
+Line <82>NOOP parao
+Line <82>NOOP parac
Line <82>NOOP newline
Line <83>NOOP tab
Line <83>NOOP tab
-Line <83>NOOP string sixth
-Line <83>NOOP gotoo
-Line <83>NOOP name name
+Line <83>NOOP string third
+Line <83>NOOP name func
+Line <83>NOOP parao
+Line <83>NOOP parac
Line <83>NOOP newline
Line <84>NOOP tab
Line <84>NOOP tab
-Line <84>NOOP string sevinth
-Line <84>NOOP jump
-Line <84>NOOP string there
+Line <84>NOOP string forth
+Line <84>NOOP name func
+Line <84>NOOP parao
+Line <84>NOOP parac
Line <84>NOOP newline
Line <85>NOOP tab
Line <85>NOOP tab
-Line <85>NOOP string eight
-Line <85>NOOP jump
-Line <85>NOOP name name
+Line <85>NOOP string fifth
+Line <85>NOOP gotoo
+Line <85>NOOP string here
Line <85>NOOP newline
Line <86>NOOP tab
-Line <86>NOOP cbracketc
+Line <86>NOOP tab
+Line <86>NOOP string sixth
+Line <86>NOOP gotoo
+Line <86>NOOP name name
Line <86>NOOP newline
+Line <87>NOOP tab
+Line <87>NOOP tab
+Line <87>NOOP string sevinth
+Line <87>NOOP jump
+Line <87>NOOP string there
Line <87>NOOP newline
+Line <88>NOOP tab
+Line <88>NOOP tab
+Line <88>NOOP string eight
+Line <88>NOOP jump
+Line <88>NOOP name name
Line <88>NOOP newline
-Line <89>NOOP bracketo
-Line <89>NOOP name Bob
-Line <89>NOOP colon
-Line <89>NOOP name char
-Line <89>NOOP bracketc
+Line <89>NOOP tab
+Line <89>NOOP cbracketc
Line <89>NOOP newline
-Line <90>NOOP tab
-Line <90>NOOP name age
-Line <90>NOOP equal
-Line <90>NOOP number 24
+Line <90>NOOP cbracketc
Line <90>NOOP newline
-Line <91>NOOP tab
-Line <91>NOOP name money
-Line <91>NOOP equal
-Line <91>NOOP number 100
Line <91>NOOP newline
Line <92>NOOP newline
Line <93>NOOP bracketo
-Line <93>NOOP name newblock
+Line <93>NOOP name Bob
Line <93>NOOP colon
-Line <93>NOOP name function
-Line <93>NOOP parao
-Line <93>NOOP parac
+Line <93>NOOP name char
Line <93>NOOP bracketc
Line <93>NOOP newline
Line <94>NOOP tab
-Line <94>NOOP string Test #2
-Line <94>NOOP number
+Line <94>NOOP name age
+Line <94>NOOP equal
+Line <94>NOOP number 24
Line <94>NOOP newline
Line <95>NOOP tab
-Line <95>NOOP string Does it parse this part properly?
+Line <95>NOOP name money
+Line <95>NOOP equal
+Line <95>NOOP number 100
Line <95>NOOP newline
-Line <97>NOOP eof
+Line <96>NOOP newline
+Line <97>NOOP bracketo
+Line <97>NOOP name newblock
+Line <97>NOOP colon
+Line <97>NOOP name function
+Line <97>NOOP parao
+Line <97>NOOP parac
+Line <97>NOOP bracketc
+Line <97>NOOP newline
+Line <98>NOOP tab
+Line <98>NOOP string Test #2
+Line <98>NOOP number
+Line <98>NOOP newline
+Line <99>NOOP tab
+Line <99>NOOP string Does it parse this part properly?
+Line <99>NOOP newline
+Line <101>NOOP eof
diff --git a/DMS/streams.cpp b/DMS/streams.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/DMS/streams.h b/DMS/streams.h
new file mode 100644
index 0000000..6f70f09
--- /dev/null
+++ b/DMS/streams.h
@@ -0,0 +1 @@
+#pragma once