Working on commands

This commit is contained in:
Ryan Wardm 2020-08-13 00:52:51 -04:00
parent c1b97b83a3
commit 1c61488119
28 changed files with 508 additions and 424 deletions

View File

@ -1,5 +1,4 @@
 DMS.cpp  LineParser.cpp
LineParser.cpp value.cpp
chunk.cpp
Generating Code... Generating Code...
DMS.vcxproj -> C:\Users\Ryan\source\repos\DMS\Debug\DMS.exe DMS.vcxproj -> C:\Users\Ryan\source\repos\DMS\Debug\DMS.exe

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -11,10 +11,26 @@ namespace dms {
return token{ tokentype::noop,codes::NOOP,"EOF",0 }; return token{ tokentype::noop,codes::NOOP,"EOF",0 };
return this->tokens[pos++]; return this->tokens[pos++];
} }
std::vector<token> tokenstream::next(tokentype to, tokentype tc) {
std::vector<token> tok;
size_t open = 0;
if (peek().type == to) {
open++;
next(); // Consume
while (open != 0) {
if (peek().type == to)
open++;
else if (peek().type == tc)
open--;
tok.push_back(next());
}
}
return tok;
}
token tokenstream::peek() { token tokenstream::peek() {
return this->tokens[pos]; return this->tokens[pos];
} }
std::vector<token> tokenstream::next(tokens::tokentype tk) { std::vector<token> tokenstream::next(tokentype tk) {
std::vector<token> temp; std::vector<token> temp;
while (peek().type!=tk) { while (peek().type!=tk) {
temp.push_back(next()); temp.push_back(next());
@ -52,15 +68,30 @@ namespace dms {
return std::string(buf.begin(), buf.end()); return std::string(buf.begin(), buf.end());
} }
void doCheck(passer* stream,std::vector<token>* t_vec, size_t line, bool &isNum, bool &hasDec, std::vector<uint8_t>* buffer) { void doCheck(passer* stream,std::vector<token>* t_vec, size_t line, bool &isNum, bool &hasDec, std::vector<uint8_t>* buffer) {
if (isNum) { std::string str = stream->processBuffer(*buffer);
if (utils::isNum(str) && isNum) {
t_vec->push_back(token{ tokens::number,codes::NOOP,stream->processBuffer(*buffer),line }); t_vec->push_back(token{ tokens::number,codes::NOOP,stream->processBuffer(*buffer),line });
buffer->clear(); buffer->clear();
isNum = false; isNum = false;
hasDec = false; hasDec = false;
} }
else if (buffer->size() > 0) { else if (buffer->size() > 0) {
std::string str = stream->processBuffer(*buffer); if (str == "nil") {
if (utils::isNum(str) && str.size() > 0) { t_vec->push_back(token{ tokens::nil,codes::NOOP,stream->processBuffer(*buffer),line });
buffer->clear();
hasDec = false;
}
else if (str == "true") {
t_vec->push_back(token{ tokens::True,codes::NOOP,stream->processBuffer(*buffer),line });
buffer->clear();
hasDec = false;
}
else if (str == "false") {
t_vec->push_back(token{ tokens::False,codes::NOOP,stream->processBuffer(*buffer),line });
buffer->clear();
hasDec = false;
}
else if (utils::isNum(str) && str.size() > 0) {
t_vec->push_back(token{ tokens::number,codes::NOOP,stream->processBuffer(*buffer),line }); t_vec->push_back(token{ tokens::number,codes::NOOP,stream->processBuffer(*buffer),line });
buffer->clear(); buffer->clear();
isNum = false; isNum = false;
@ -86,22 +117,58 @@ namespace dms {
return true; return true;
if (stream.tokens[stream.pos+i].type != types[i]) if (stream.tokens[stream.pos+i].type != types[i])
return false; return false;
//print(stream.tokens[stream.pos + i].type, " | ", types[i]);
} }
return true; return true;
} }
tokentype* LineParser::expr() {
return new tokentype[9]{ tokens::name,tokens::number,tokens::divide,tokens::minus,tokens::mod,tokens::multiply,tokens::plus,tokens::pow ,tokens::none };
// tokens::none tells us we are at the end of the array.
}
tokentype* LineParser::variable() {
return new tokentype[7]{tokens::name,tokens::number,tokens::True,tokens::False,tokens::nil,tokens::string,tokens::none};
// tokens::none tells us we are at the end of the array.
}
bool inList(tokens::tokentype t,tokens::tokentype* list) {
size_t c = 0;
while (list[c] != tokens::none) {
if (list[c] == t)
return true;
}
return false;
}
// Todo create a match method that matches until a certain symbol... We need to finish the choice block stuff as well!
bool LineParser::match(tokenstream stream, tokens::tokentype* t1, tokens::tokentype* t2, tokens::tokentype* t3, tokens::tokentype* t4, tokens::tokentype* t5, tokens::tokentype* t6, tokens::tokentype* t7, tokens::tokentype* t8, tokens::tokentype* t9, tokens::tokentype* t10, tokens::tokentype* t11, tokens::tokentype* t12) {
tokens::tokentype* types[12] = { t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12 };
for (size_t i = 0; i < 12; i++) {
if (types[i] == nullptr)
return true;
if (!inList(stream.tokens[stream.pos + i].type, types[i]))
return false;
}
return true;
}
// This function is broken
std::map<std::string, chunk*> LineParser::tokenizer(dms_state* state,std::vector<token> &toks) { std::map<std::string, chunk*> LineParser::tokenizer(dms_state* state,std::vector<token> &toks) {
std::map<std::string,chunk*> chunks; std::map<std::string,chunk*> chunks;
chunk* current_chunk = nullptr; chunk* current_chunk = nullptr;
std::string chunk_name; std::string chunk_name;
blocktype chunk_type; blocktype chunk_type = bt_block;
size_t line=1; size_t line=1;
tokenstream stream; tokenstream stream;
stream.init(&toks); stream.init(&toks);
token current = stream.next(); token current = stream.next();
std::vector<token> temp; std::vector<token> temp;
size_t tabs = 0;
while (stream.peek().type != tokens::eof) { while (stream.peek().type != tokens::eof) {
print(current); print(current);
if (current.type == tokens::tab)
tabs++;
if (current.type == tokens::flag) { if (current.type == tokens::flag) {
temp = stream.next(tokens::newline); temp = stream.next(tokens::newline);
if (temp.size() != 2) { if (temp.size() != 2) {
@ -110,12 +177,14 @@ namespace dms {
codes::op code = current.raw; codes::op code = current.raw;
tokens::tokentype tok = temp[0].type; tokens::tokentype tok = temp[0].type;
if (code == codes::ENAB && tok == tokens::name) { 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) { else if (code == codes::ENTR && tok == tokens::name) {
state->entry = temp[0].name; state->entry = temp[0].name;
} }
else if (code == codes::DISA && tok == tokens::name) { else if (code == codes::DISA && tok == tokens::name) {
tolower(temp[0].name);
state->enables.insert_or_assign(temp[0].name, false); state->enables.insert_or_assign(temp[0].name, false);
} }
else if (code == codes::VERN && tok == tokens::number) { else if (code == codes::VERN && tok == tokens::number) {
@ -133,8 +202,6 @@ namespace dms {
state->push_error(errors::error{errors::badtoken,str.str(),true,line}); state->push_error(errors::error{errors::badtoken,str.str(),true,line});
} }
} }
//Todo Finish the chunk data stuff
if (match(stream,tokens::newline,tokens::bracketo,tokens::name,tokens::bracketc)) { if (match(stream,tokens::newline,tokens::bracketo,tokens::name,tokens::bracketc)) {
stream.next(); stream.next();
if (current_chunk != nullptr) { if (current_chunk != nullptr) {
@ -217,9 +284,9 @@ namespace dms {
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) { if (tokens[i].type == tokens::name) {
// We got a name which is refering to a variable so lets build one // We got a name which is refering to a variable so lets build one
value v; value* v = new value{};
v.type = variable; // Special type, it writes data to the string portion, but is interperted as a lookup v->type = datatypes::variable; // Special type, it writes data to the string portion, but is interperted as a lookup
v.s = buildString(tokens[i].name); v->s = buildString(tokens[i].name);
args.push(v); args.push(v);
} }
else if (tokens[i].type == tokens::seperator) { else if (tokens[i].type == tokens::seperator) {
@ -240,6 +307,47 @@ namespace dms {
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 (match(stream,tokens::tab,tokens::control)) {
stream.next(); // Standard consumption
token control = stream.next();
if (control.raw == codes::CHOI && stream.peek().type==tokens::string) {
// Let's parse choice blocks.
print("Choice block found!");
bool good = true;
while (good) {
if (match(stream, new tokentype[2]{ tokens::string,tokens::none })) {
}
}
}
}
// Displays both with a target and without
if (match(stream, tokens::tab, tokens::string, tokens::newline)) {
// ToDo Implement the command for this
stream.next(); // Standard consumption
print("DISP := ", stream.next().name);
}
else if (match(stream, tokens::tab, tokens::name, tokens::string, tokens::newline)) {
// Here we mathc Name "This guy said this!"
stream.next(); // Standard consumption
std::string name = stream.next().name;
std::string msg = stream.next().name;
print("DISP := ", name , " says '",msg,"'");
// You notice that we dont consume the new line, some commands match new line as the front. It's best to not consume to allow those patterns to go through
}
// function stuff
/*if (match(stream, tokens::name, tokens::parao)) {
std::string n = stream.next().name;
std::vector<token> t = stream.next(tokens::parao, tokens::parac);
std::cout << "---Tokens---" << std::endl;
for (size_t i = 0; i < t.size()-1; i++) {
std::cout << t[i] << std::endl;
}
wait();
}*/
if (current.type != tokens::tab)
tabs=0;
current = stream.next(); current = stream.next();
} }
chunks.insert_or_assign(current_chunk->name, current_chunk); chunks.insert_or_assign(current_chunk->name, current_chunk);
@ -421,7 +529,7 @@ namespace dms {
if (data == ' ' && !isStr) { // tokens end with a space if (data == ' ' && !isStr) { // tokens end with a space
std::string str = stream.processBuffer(buffer); std::string str = stream.processBuffer(buffer);
tolower(str); tolower(str);
buffer.clear(); print("> ",str);
if (str == "enable") { if (str == "enable") {
t_vec.push_back(token{ tokens::flag,codes::ENAB,"",line }); t_vec.push_back(token{ tokens::flag,codes::ENAB,"",line });
} else if (str == "entry") { } else if (str == "entry") {
@ -451,7 +559,7 @@ namespace dms {
else if (str == "true") { else if (str == "true") {
t_vec.push_back(token{ tokens::True,codes::NOOP,"",line }); t_vec.push_back(token{ tokens::True,codes::NOOP,"",line });
} }
else if (str == "False") { else if (str == "false") {
t_vec.push_back(token{ tokens::False,codes::NOOP,"",line }); t_vec.push_back(token{ tokens::False,codes::NOOP,"",line });
} }
else if (str == "else") { else if (str == "else") {
@ -476,7 +584,7 @@ namespace dms {
t_vec.push_back(token{ tokens::nil,codes::NOOP,"",line }); t_vec.push_back(token{ tokens::nil,codes::NOOP,"",line });
} }
else if (utils::isalphanum(str) && str.size()>0) { else if (utils::isalphanum(str) && str.size()>0) {
t_vec.push_back(token{ tokens::name,codes::NOOP,str,line }); t_vec.push_back(token{ tokens::name,codes::NOOP,stream.processBuffer(buffer),line });
} }
else { else {
// Unknown command! // Unknown command!
@ -484,6 +592,7 @@ namespace dms {
tok.name = str; tok.name = str;
tok.line_num = line;*/ tok.line_num = line;*/
} }
buffer.clear();
} }
data = stream.next(); data = stream.next();
} }

View File

@ -20,6 +20,7 @@ namespace dms {
size_t pos = 0; size_t pos = 0;
void init(std::vector<tokens::token>* ptr); void init(std::vector<tokens::token>* ptr);
tokens::token next(); tokens::token next();
std::vector<tokens::token> next(tokens::tokentype to,tokens::tokentype tc);
tokens::token peek(); tokens::token peek();
std::vector<tokens::token> next(tokens::tokentype tk); std::vector<tokens::token> next(tokens::tokentype tk);
}; };
@ -44,7 +45,10 @@ namespace dms {
LineParser(); 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 //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); 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);
bool match(tokenstream stream, tokens::tokentype* t1 = nullptr,tokens::tokentype* t2 = nullptr, tokens::tokentype* t3 = nullptr, tokens::tokentype* t4 = nullptr, tokens::tokentype* t5 = nullptr, tokens::tokentype* t6 = nullptr, tokens::tokentype* t7 = nullptr, tokens::tokentype* t8 = nullptr, tokens::tokentype* t9 = nullptr, tokens::tokentype* t10 = nullptr, tokens::tokentype* t11 = nullptr, tokens::tokentype* t12 = nullptr);
void tolower(std::string &str); void tolower(std::string &str);
tokens::tokentype* expr();
tokens::tokentype* variable();
std::map<std::string, chunk*> tokenizer(dms_state* state, std::vector<tokens::token> &tok); std::map<std::string, chunk*> tokenizer(dms_state* state, std::vector<tokens::token> &tok);
}; };
} }

View File

@ -7,6 +7,7 @@ namespace dms {
} }
void dms_state::push_warning(errors::error err) { void dms_state::push_warning(errors::error err) {
err.crash = false; // Force code to not crash then push the error err.crash = false; // Force code to not crash then push the error
if(enables.count("warnings"))
push_error(err); push_error(err);
} }
} }

View File

@ -21,14 +21,14 @@ Line <8>NOOP name char
Line <8>NOOP bracketc Line <8>NOOP bracketc
Line <8>NOOP newline Line <8>NOOP newline
Line <9>NOOP tab Line <9>NOOP tab
Line <9>NOOP name name Line <9>NOOP name age
Line <9>NOOP equal Line <9>NOOP equal
Line <9>NOOP string Ryan Line <9>NOOP number 21
Line <9>NOOP newline Line <9>NOOP newline
Line <10>NOOP tab Line <10>NOOP tab
Line <10>NOOP name age Line <10>NOOP name money
Line <10>NOOP equal Line <10>NOOP equal
Line <10>NOOP number 21 Line <10>NOOP number 1000
Line <10>NOOP newline Line <10>NOOP newline
Line <11>NOOP newline Line <11>NOOP newline
Line <12>NOOP bracketo Line <12>NOOP bracketo
@ -58,465 +58,475 @@ Line <14>NOOP name b
Line <14>NOOP parac Line <14>NOOP parac
Line <14>NOOP divide Line <14>NOOP divide
Line <14>NOOP name c Line <14>NOOP name c
Line <14>NOOP name nil
Line <14>NOOP newline Line <14>NOOP newline
Line <15>NOOP tab Line <15>NOOP tab
Line <15>RETN ret Line <15>NOOP name e
Line <15>NOOP name d Line <15>NOOP equal
Line <15>NOOP nil nil
Line <15>NOOP newline Line <15>NOOP newline
Line <16>NOOP tab
Line <16>NOOP name f
Line <16>NOOP equal
Line <16>NOOP true true
Line <16>NOOP newline Line <16>NOOP newline
Line <17>NOOP bracketo Line <17>NOOP tab
Line <17>NOOP name main Line <17>NOOP name g
Line <17>NOOP bracketc Line <17>NOOP equal
Line <17>NOOP false false
Line <17>NOOP newline Line <17>NOOP newline
Line <18>NOOP tab Line <18>NOOP tab
Line <18>NOOP string This works! Line <18>RETN ret
Line <18>NOOP name d
Line <18>NOOP newline Line <18>NOOP newline
Line <19>NOOP tab
Line <19>NOOP string What's up
Line <19>NOOP newline Line <19>NOOP newline
Line <20>NOOP bracketo
Line <20>NOOP name main
Line <20>NOOP bracketc
Line <20>NOOP newline Line <20>NOOP newline
Line <21>NOOP tab Line <21>NOOP tab
Line <21>NOOP name ryan Line <21>NOOP string This works!
Line <21>NOOP string Hello "how" are you doing?
Line <21>NOOP newline Line <21>NOOP newline
Line <22>NOOP tab Line <22>NOOP tab
Line <22>NOOP name bob Line <22>NOOP string What's up
Line <22>NOOP string I'm good you?
Line <22>NOOP newline Line <22>NOOP newline
Line <23>NOOP tab
Line <23>NOOP newline Line <23>NOOP newline
Line <24>NOOP tab Line <24>NOOP tab
Line <24>NOOP name tester Line <24>NOOP name Ryan
Line <24>NOOP equal Line <24>NOOP string Hello "how" are you doing?
Line <24>NOOP string Hello
Line <24>NOOP newline Line <24>NOOP newline
Line <25>NOOP tab Line <25>NOOP tab
Line <25>NOOP name Bob
Line <25>NOOP string I'm good you?
Line <25>NOOP newline Line <25>NOOP newline
Line <26>NOOP tab Line <26>NOOP tab
Line <26>NOOP name food
Line <26>NOOP equal
Line <26>NOOP number 3
Line <26>NOOP newline Line <26>NOOP newline
Line <27>NOOP tab Line <27>NOOP tab
Line <27>NOOP name tester
Line <27>NOOP equal
Line <27>NOOP string Hello
Line <27>NOOP newline Line <27>NOOP newline
Line <28>NOOP tab 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 <28>NOOP newline
Line <29>NOOP tab
Line <29>NOOP name food
Line <29>NOOP equal
Line <29>NOOP number 3
Line <29>NOOP newline Line <29>NOOP newline
Line <30>NOOP tab Line <30>NOOP tab
Line <30>NOOP name list
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 <30>NOOP newline
Line <31>NOOP tab Line <31>NOOP tab
Line <31>NOOP name a Line <31>NOOP name hi
Line <31>NOOP equal Line <31>NOOP equal
Line <31>NOOP name list Line <31>NOOP cbracketo
Line <31>NOOP bracketo
Line <31>NOOP number 1 Line <31>NOOP number 1
Line <31>NOOP bracketc Line <31>NOOP seperator
Line <31>NOOP number 2
Line <31>NOOP seperator
Line <31>NOOP number 3
Line <31>NOOP cbracketc
Line <31>NOOP newline Line <31>NOOP newline
Line <32>NOOP newline Line <32>NOOP newline
Line <33>NOOP tab Line <33>NOOP tab
Line <33>NOOP name hungry Line <33>NOOP name list
Line <33>NOOP equal Line <33>NOOP equal
Line <33>NOOP parao Line <33>NOOP cbracketo
Line <33>NOOP minus Line <33>NOOP cbracketo
Line <33>NOOP number 2 Line <33>NOOP number 1
Line <33>NOOP plus Line <33>NOOP seperator
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 number 2
Line <33>NOOP plus Line <33>NOOP plus
Line <33>NOOP name food
Line <33>NOOP seperator
Line <33>NOOP name hi
Line <33>NOOP bracketo
Line <33>NOOP number 3
Line <33>NOOP bracketc
Line <33>NOOP cbracketc
Line <33>NOOP seperator
Line <33>NOOP true true
Line <33>NOOP seperator
Line <33>NOOP name tester
Line <33>NOOP seperator
Line <33>NOOP number 123
Line <33>NOOP seperator
Line <33>NOOP string This is a string!
Line <33>NOOP seperator
Line <33>NOOP false false
Line <33>NOOP seperator
Line <33>NOOP cbracketo
Line <33>NOOP number 3
Line <33>NOOP seperator
Line <33>NOOP number 2 Line <33>NOOP number 2
Line <33>NOOP seperator
Line <33>NOOP number 1
Line <33>NOOP cbracketc
Line <33>NOOP cbracketc
Line <33>NOOP newline Line <33>NOOP newline
Line <34>NOOP tab Line <34>NOOP tab
Line <34>NOOP name a
Line <34>NOOP equal
Line <34>NOOP name list Line <34>NOOP name list
Line <34>NOOP bracketo Line <34>NOOP bracketo
Line <34>NOOP number 1 Line <34>NOOP number 1
Line <34>NOOP bracketc Line <34>NOOP bracketc
Line <34>NOOP equal
Line <34>NOOP string Hello
Line <34>NOOP newline Line <34>NOOP newline
Line <35>NOOP tab
Line <35>NOOP number var1
Line <35>NOOP seperator
Line <35>NOOP name var2
Line <35>NOOP number
Line <35>NOOP equal
Line <35>NOOP name func
Line <35>NOOP parao
Line <35>NOOP number 1
Line <35>NOOP seperator
Line <35>NOOP string string
Line <35>NOOP seperator
Line <35>NOOP number 2
Line <35>NOOP plus
Line <35>NOOP number 5
Line <35>NOOP parac
Line <35>NOOP newline Line <35>NOOP newline
Line <36>NOOP tab Line <36>NOOP tab
Line <36>NOOP name a Line <36>NOOP name hungry
Line <36>NOOP equal 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 parao
Line <36>NOOP number 1 Line <36>NOOP minus
Line <36>NOOP seperator
Line <36>NOOP string string
Line <36>NOOP seperator
Line <36>NOOP number 2 Line <36>NOOP number 2
Line <36>NOOP plus Line <36>NOOP plus
Line <36>NOOP number 4
Line <36>NOOP minus
Line <36>NOOP parao
Line <36>NOOP parao
Line <36>NOOP number 5
Line <36>NOOP multiply
Line <36>NOOP number 5
Line <36>NOOP parac
Line <36>NOOP divide
Line <36>NOOP name sqrt
Line <36>NOOP parao
Line <36>NOOP number 144
Line <36>NOOP plus
Line <36>NOOP number 5 Line <36>NOOP number 5
Line <36>NOOP parac Line <36>NOOP parac
Line <36>NOOP parac
Line <36>NOOP parac
Line <36>NOOP pow
Line <36>NOOP number 2
Line <36>NOOP multiply
Line <36>NOOP number 2
Line <36>NOOP plus Line <36>NOOP plus
Line <36>NOOP number 100 Line <36>NOOP number 2
Line <36>NOOP newline Line <36>NOOP newline
Line <37>NOOP tab Line <37>NOOP tab
Line <37>NOOP name func Line <37>NOOP name list
Line <37>NOOP parao Line <37>NOOP bracketo
Line <37>NOOP number 1 Line <37>NOOP number 1
Line <37>NOOP seperator Line <37>NOOP bracketc
Line <37>NOOP string string Line <37>NOOP equal
Line <37>NOOP seperator Line <37>NOOP string Hello
Line <37>NOOP number 2
Line <37>NOOP plus
Line <37>NOOP number 5
Line <37>NOOP parac
Line <37>NOOP newline Line <37>NOOP newline
Line <38>NOOP tab Line <38>NOOP tab
Line <38>NOOP label label Line <38>NOOP name var1
Line <38>NOOP seperator
Line <38>NOOP name var2
Line <38>NOOP number
Line <38>NOOP equal
Line <38>NOOP name func
Line <38>NOOP parao
Line <38>NOOP number 1
Line <38>NOOP seperator
Line <38>NOOP string string
Line <38>NOOP seperator
Line <38>NOOP number 2
Line <38>NOOP plus
Line <38>NOOP number 5
Line <38>NOOP parac
Line <38>NOOP newline Line <38>NOOP newline
Line <39>NOOP tab Line <39>NOOP tab
Line <39>NOOP name a
Line <39>NOOP equal
Line <39>NOOP name 100
Line <39>NOOP number
Line <39>NOOP plus
Line <39>NOOP name func
Line <39>NOOP parao
Line <39>NOOP number 1
Line <39>NOOP seperator
Line <39>NOOP string string
Line <39>NOOP seperator
Line <39>NOOP number 2
Line <39>NOOP plus
Line <39>NOOP number 5
Line <39>NOOP parac
Line <39>NOOP plus
Line <39>NOOP number 100
Line <39>NOOP newline Line <39>NOOP newline
Line <40>NOOP tab Line <40>NOOP tab
Line <40>NOOP name func
Line <40>NOOP parao
Line <40>NOOP number 1
Line <40>NOOP seperator
Line <40>NOOP string string
Line <40>NOOP seperator
Line <40>NOOP number 2
Line <40>NOOP plus
Line <40>NOOP number 5
Line <40>NOOP parac
Line <40>NOOP newline Line <40>NOOP newline
Line <41>NOOP tab Line <41>NOOP tab
Line <41>CHOI control Line <41>NOOP label label
Line <41>NOOP string Pick one:
Line <41>NOOP newline Line <41>NOOP newline
Line <42>NOOP tab Line <42>NOOP tab
Line <42>NOOP tab
Line <42>NOOP string first
Line <42>NOOP name func
Line <42>NOOP parao
Line <42>NOOP parac
Line <42>NOOP newline Line <42>NOOP newline
Line <43>NOOP tab Line <43>NOOP tab
Line <43>NOOP tab
Line <43>NOOP string second
Line <43>NOOP name func
Line <43>NOOP parao
Line <43>NOOP parac
Line <43>NOOP newline Line <43>NOOP newline
Line <44>NOOP tab Line <44>NOOP tab
Line <44>NOOP tab Line <44>CHOI control
Line <44>NOOP string third Line <44>NOOP string Pick one:
Line <44>NOOP name func
Line <44>NOOP parao
Line <44>NOOP parac
Line <44>NOOP newline Line <44>NOOP newline
Line <45>NOOP tab Line <45>NOOP tab
Line <45>NOOP tab Line <45>NOOP tab
Line <45>NOOP string forth Line <45>NOOP string first
Line <45>NOOP name func Line <45>NOOP name func
Line <45>NOOP parao Line <45>NOOP parao
Line <45>NOOP parac Line <45>NOOP parac
Line <45>NOOP newline Line <45>NOOP newline
Line <46>NOOP tab
Line <46>NOOP tab
Line <46>NOOP string second
Line <46>NOOP name func
Line <46>NOOP parao
Line <46>NOOP parac
Line <46>NOOP newline Line <46>NOOP newline
Line <47>NOOP tab Line <47>NOOP tab
Line <47>NOOP for Line <47>NOOP tab
Line <47>NOOP name x Line <47>NOOP string third
Line <47>NOOP equal Line <47>NOOP name func
Line <47>NOOP number 1 Line <47>NOOP parao
Line <47>NOOP seperator Line <47>NOOP parac
Line <47>NOOP number 10
Line <47>NOOP newline Line <47>NOOP newline
Line <48>NOOP tab Line <48>NOOP tab
Line <48>NOOP tab Line <48>NOOP tab
Line <48>NOOP for Line <48>NOOP string forth
Line <48>NOOP name y Line <48>NOOP name func
Line <48>NOOP equal Line <48>NOOP parao
Line <48>NOOP number 1 Line <48>NOOP parac
Line <48>NOOP seperator
Line <48>NOOP number 10
Line <48>NOOP seperator
Line <48>NOOP number 1
Line <48>NOOP newline Line <48>NOOP newline
Line <49>NOOP tab
Line <49>NOOP tab
Line <49>NOOP tab
Line <49>NOOP for
Line <49>NOOP name z
Line <49>NOOP equal
Line <49>NOOP number 1
Line <49>NOOP seperator
Line <49>NOOP number 10
Line <49>NOOP newline Line <49>NOOP newline
Line <50>NOOP tab Line <50>NOOP tab
Line <50>NOOP tab Line <50>NOOP for
Line <50>NOOP tab Line <50>NOOP name x
Line <50>NOOP tab Line <50>NOOP equal
Line <50>NOOP string test Line <50>NOOP number 1
Line <50>NOOP seperator
Line <50>NOOP number 10
Line <50>NOOP newline Line <50>NOOP newline
Line <51>NOOP tab Line <51>NOOP tab
Line <51>NOOP tab Line <51>NOOP tab
Line <51>NOOP tab Line <51>NOOP for
Line <51>NOOP tab Line <51>NOOP name y
Line <51>NOOP string $x$ $y$ $z$ Line <51>NOOP equal
Line <51>NOOP number 1
Line <51>NOOP seperator
Line <51>NOOP number 10
Line <51>NOOP seperator
Line <51>NOOP number 1
Line <51>NOOP newline Line <51>NOOP newline
Line <52>NOOP tab Line <52>NOOP tab
Line <52>NOOP name test Line <52>NOOP tab
Line <52>NOOP tab
Line <52>NOOP for
Line <52>NOOP name z
Line <52>NOOP equal Line <52>NOOP equal
Line <52>NOOP name true Line <52>NOOP number 1
Line <52>NOOP seperator
Line <52>NOOP number 10
Line <52>NOOP newline Line <52>NOOP newline
Line <53>NOOP tab Line <53>NOOP tab
Line <53>NOOP name test2 Line <53>NOOP tab
Line <53>NOOP number Line <53>NOOP tab
Line <53>NOOP equal Line <53>NOOP tab
Line <53>NOOP name false Line <53>NOOP string test
Line <53>NOOP newline Line <53>NOOP newline
Line <54>NOOP tab Line <54>NOOP tab
Line <54>NOOP tab
Line <54>NOOP tab
Line <54>NOOP tab
Line <54>NOOP string $x$ $y$ $z$
Line <54>NOOP newline Line <54>NOOP newline
Line <55>NOOP tab Line <55>NOOP tab
Line <55>NOOP name count Line <55>NOOP name test
Line <55>NOOP equal Line <55>NOOP equal
Line <55>NOOP number 0 Line <55>NOOP true true
Line <55>NOOP newline Line <55>NOOP newline
Line <56>NOOP tab Line <56>NOOP tab
Line <56>NOOP name test2
Line <56>NOOP number
Line <56>NOOP equal
Line <56>NOOP false false
Line <56>NOOP newline Line <56>NOOP newline
Line <57>NOOP tab Line <57>NOOP tab
Line <57>WHLE control
Line <57>NOOP name count
Line <57>NOOP not
Line <57>NOOP equal
Line <57>NOOP number 100
Line <57>NOOP newline Line <57>NOOP newline
Line <58>NOOP tab Line <58>NOOP tab
Line <58>NOOP tab
Line <58>NOOP name count Line <58>NOOP name count
Line <58>NOOP plus Line <58>NOOP equal
Line <58>NOOP plus Line <58>NOOP number 0
Line <58>NOOP newline Line <58>NOOP newline
Line <59>NOOP tab Line <59>NOOP tab
Line <59>NOOP tab
Line <59>NOOP string Count = $count$
Line <59>NOOP newline Line <59>NOOP newline
Line <60>NOOP tab Line <60>NOOP tab
Line <60>WHLE control
Line <60>NOOP name count
Line <60>NOOP not
Line <60>NOOP equal
Line <60>NOOP number 100
Line <60>NOOP newline Line <60>NOOP newline
Line <61>NOOP tab Line <61>NOOP tab
Line <61>IFFF control Line <61>NOOP tab
Line <61>NOOP parao Line <61>NOOP name count
Line <61>NOOP name func Line <61>NOOP plus
Line <61>NOOP parao Line <61>NOOP plus
Line <61>NOOP number 123
Line <61>NOOP parac
Line <61>NOOP not
Line <61>NOOP equal
Line <61>NOOP name name
Line <61>NOOP bracketo
Line <61>NOOP number 1
Line <61>NOOP bracketc
Line <61>NOOP or
Line <61>NOOP true
Line <61>NOOP equal
Line <61>NOOP equal
Line <61>NOOP string Bob
Line <61>NOOP parac
Line <61>NOOP and
Line <61>NOOP name foodcount
Line <61>NOOP equal
Line <61>NOOP number 10.34
Line <61>NOOP newline Line <61>NOOP newline
Line <62>NOOP tab Line <62>NOOP tab
Line <62>NOOP tab Line <62>NOOP tab
Line <62>NOOP string test=true or test2=false! Line <62>NOOP string Count = $count$
Line <62>NOOP number
Line <62>NOOP newline Line <62>NOOP newline
Line <63>NOOP tab Line <63>NOOP tab
Line <63>NOOP tab
Line <63>NOOP string help me
Line <63>NOOP newline Line <63>NOOP newline
Line <64>NOOP tab Line <64>NOOP tab
Line <64>NOOP tab
Line <64>IFFF control Line <64>IFFF control
Line <64>NOOP name cool Line <64>NOOP parao
Line <64>NOOP name func
Line <64>NOOP parao
Line <64>NOOP number 123
Line <64>NOOP parac
Line <64>NOOP not
Line <64>NOOP equal
Line <64>NOOP name name
Line <64>NOOP bracketo
Line <64>NOOP number 1
Line <64>NOOP bracketc
Line <64>NOOP or
Line <64>NOOP true
Line <64>NOOP equal Line <64>NOOP equal
Line <64>NOOP equal Line <64>NOOP equal
Line <64>NOOP name true Line <64>NOOP string Bob
Line <64>NOOP parac
Line <64>NOOP and
Line <64>NOOP name foodCount
Line <64>NOOP equal
Line <64>NOOP number 10.34
Line <64>NOOP newline Line <64>NOOP newline
Line <65>NOOP tab Line <65>NOOP tab
Line <65>NOOP tab Line <65>NOOP tab
Line <65>NOOP tab Line <65>NOOP string test=true or test2=false!
Line <65>NOOP string We are here Line <65>NOOP number
Line <65>NOOP newline Line <65>NOOP newline
Line <66>NOOP tab Line <66>NOOP tab
Line <66>NOOP tab Line <66>NOOP tab
Line <66>NOOP tab Line <66>NOOP string help me
Line <66>NOOP string Nested if
Line <66>NOOP newline Line <66>NOOP newline
Line <67>NOOP tab Line <67>NOOP tab
Line <67>NOOP tab Line <67>NOOP tab
Line <67>ELIF control Line <67>IFFF control
Line <67>NOOP name food Line <67>NOOP name cool
Line <67>NOOP equal Line <67>NOOP equal
Line <67>NOOP number 21 Line <67>NOOP equal
Line <67>NOOP true true
Line <67>NOOP newline Line <67>NOOP newline
Line <68>NOOP tab Line <68>NOOP tab
Line <68>NOOP tab Line <68>NOOP tab
Line <68>NOOP tab Line <68>NOOP tab
Line <68>NOOP string This is getting weird Line <68>NOOP string We are here
Line <68>NOOP newline Line <68>NOOP newline
Line <69>NOOP tab Line <69>NOOP tab
Line <69>NOOP tab Line <69>NOOP tab
Line <69>NOOP string Hi Line <69>NOOP tab
Line <69>NOOP string Nested if
Line <69>NOOP newline Line <69>NOOP newline
Line <70>NOOP tab Line <70>NOOP tab
Line <70>NOOP tab
Line <70>ELIF control Line <70>ELIF control
Line <70>NOOP parao Line <70>NOOP name food
Line <70>NOOP number func2
Line <70>NOOP parao
Line <70>NOOP number 321
Line <70>NOOP parac
Line <70>NOOP not
Line <70>NOOP equal Line <70>NOOP equal
Line <70>NOOP number name2 Line <70>NOOP number 21
Line <70>NOOP bracketo
Line <70>NOOP number 1
Line <70>NOOP bracketc
Line <70>NOOP or
Line <70>NOOP true
Line <70>NOOP equal
Line <70>NOOP equal
Line <70>NOOP string Bob2
Line <70>NOOP number
Line <70>NOOP parac
Line <70>NOOP and
Line <70>NOOP name foodcount2
Line <70>NOOP number
Line <70>NOOP equal
Line <70>NOOP number 1.78
Line <70>NOOP newline Line <70>NOOP newline
Line <71>NOOP tab Line <71>NOOP tab
Line <71>NOOP tab Line <71>NOOP tab
Line <71>NOOP string This Block Line <71>NOOP tab
Line <71>NOOP string This is getting weird
Line <71>NOOP newline Line <71>NOOP newline
Line <72>NOOP tab Line <72>NOOP tab
Line <72>NOOP name else Line <72>NOOP tab
Line <72>NOOP string Hi
Line <72>NOOP newline Line <72>NOOP newline
Line <73>NOOP tab Line <73>NOOP tab
Line <73>NOOP tab Line <73>ELIF control
Line <73>NOOP string That Block Line <73>NOOP parao
Line <73>NOOP name func2
Line <73>NOOP parao
Line <73>NOOP number 321
Line <73>NOOP parac
Line <73>NOOP not
Line <73>NOOP equal
Line <73>NOOP name name2
Line <73>NOOP bracketo
Line <73>NOOP number 1
Line <73>NOOP bracketc
Line <73>NOOP or
Line <73>NOOP true
Line <73>NOOP equal
Line <73>NOOP equal
Line <73>NOOP string Bob2
Line <73>NOOP number
Line <73>NOOP parac
Line <73>NOOP and
Line <73>NOOP name foodCount2
Line <73>NOOP number
Line <73>NOOP equal
Line <73>NOOP number 1.78
Line <73>NOOP newline Line <73>NOOP newline
Line <74>NOOP tab Line <74>NOOP tab
Line <74>NOOP string ah this is why no pop Line <74>NOOP tab
Line <74>NOOP string This Block
Line <74>NOOP newline Line <74>NOOP newline
Line <75>NOOP tab
Line <75>NOOP name else
Line <75>NOOP newline Line <75>NOOP newline
Line <76>NOOP bracketo Line <76>NOOP tab
Line <76>NOOP name Ryan Line <76>NOOP tab
Line <76>NOOP colon Line <76>NOOP string That Block
Line <76>NOOP name char
Line <76>NOOP bracketc
Line <76>NOOP newline Line <76>NOOP newline
Line <77>NOOP tab Line <77>NOOP tab
Line <77>NOOP name age Line <77>NOOP string ah this is why no pop
Line <77>NOOP equal
Line <77>NOOP number 24
Line <77>NOOP newline Line <77>NOOP newline
Line <78>NOOP tab
Line <78>NOOP name money
Line <78>NOOP equal
Line <78>NOOP number 100
Line <78>NOOP newline Line <78>NOOP newline
Line <79>NOOP tab Line <79>NOOP bracketo
Line <79>NOOP name Bob
Line <79>NOOP colon
Line <79>NOOP name char
Line <79>NOOP bracketc
Line <79>NOOP newline Line <79>NOOP newline
Line <80>NOOP bracketo Line <80>NOOP tab
Line <80>NOOP name test Line <80>NOOP name age
Line <80>NOOP colon Line <80>NOOP equal
Line <80>NOOP name env Line <80>NOOP number 24
Line <80>NOOP bracketc
Line <80>NOOP newline Line <80>NOOP newline
Line <81>NOOP tab Line <81>NOOP tab
Line <81>NOOP string test Line <81>NOOP name money
Line <81>NOOP equal
Line <81>NOOP number 100
Line <81>NOOP newline Line <81>NOOP newline
Line <82>NOOP tab
Line <82>NOOP newline Line <82>NOOP newline
Line <83>NOOP bracketo Line <83>NOOP bracketo
Line <83>NOOP name newblock Line <83>NOOP name test
Line <83>NOOP colon Line <83>NOOP colon
Line <83>NOOP name function Line <83>NOOP name env
Line <83>NOOP parao
Line <83>NOOP parac
Line <83>NOOP bracketc Line <83>NOOP bracketc
Line <83>NOOP newline Line <83>NOOP newline
Line <84>NOOP tab Line <84>NOOP tab
Line <84>NOOP string Test #2 Line <84>NOOP string test
Line <84>NOOP number
Line <84>NOOP newline Line <84>NOOP newline
Line <85>NOOP tab
Line <85>NOOP string Does it parse this part properly?
Line <85>NOOP newline Line <85>NOOP newline
Line <87>NOOP eof Line <86>NOOP bracketo
Line <86>NOOP name newblock
Line <86>NOOP colon
Line <86>NOOP name function
Line <86>NOOP parao
Line <86>NOOP parac
Line <86>NOOP bracketc
Line <86>NOOP newline
Line <87>NOOP tab
Line <87>NOOP string Test #2
Line <87>NOOP number
Line <87>NOOP newline
Line <88>NOOP tab
Line <88>NOOP string Does it parse this part properly?
Line <88>NOOP newline
Line <90>NOOP eof

View File

@ -10,7 +10,7 @@ namespace dms::number_utils {
if (args.args.size() == 0) if (args.args.size() == 0)
return buildNumber(-1); // ABS cannot be -1, this is an error return buildNumber(-1); // ABS cannot be -1, this is an error
if (utils::typeassert(args, number)) { if (utils::typeassert(args, number)) {
double temp = args.args[0].n->val; double temp = args.args[0]->n->val;
return buildNumber(temp*temp / 2); return buildNumber(temp*temp / 2);
} }
return buildNumber(-1); return buildNumber(-1);
@ -19,8 +19,8 @@ namespace dms::number_utils {
size_t size = args.args.size(); size_t size = args.args.size();
double max = std::numeric_limits<double>::min(); double max = std::numeric_limits<double>::min();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
if (args.args[i].n->val > max) if (args.args[i]->n->val > max)
max = args.args[i].n->val; max = args.args[i]->n->val;
} }
return buildNumber(max); return buildNumber(max);
} }

View File

@ -18,8 +18,8 @@ namespace dms::string_utils {
return buildString(""); return buildString("");
} }
if (utils::typeassert(state, args, string)) { if (utils::typeassert(state, args, string)) {
size_t size = args.args[0].s->length; size_t size = args.args[0]->s->length;
uint8_t* newptr = copyStr(*args.args[0].s, 0, size); uint8_t* newptr = copyStr(*args.args[0]->s, 0, size);
std::reverse(newptr, newptr + size); std::reverse(newptr, newptr + size);
dms_string* newstr = new dms_string{ size, newptr }; dms_string* newstr = new dms_string{ size, newptr };
return newstr; return newstr;
@ -33,9 +33,9 @@ namespace dms::string_utils {
return buildString(""); return buildString("");
} }
if (utils::typeassert(state, args, string, number, number)) { if (utils::typeassert(state, args, string, number, number)) {
size_t start = args.args[1].n->val; size_t start = args.args[1]->n->val;
size_t size = args.args[2].n->val; size_t size = args.args[2]->n->val;
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
if (start + size > str.length) { if (start + size > str.length) {
state->push_error(errors::error{ errors::invalid_arguments,"Expected a string object, got nil." }); state->push_error(errors::error{ errors::invalid_arguments,"Expected a string object, got nil." });
return buildString(""); return buildString("");
@ -56,7 +56,7 @@ namespace dms::string_utils {
return buildString(""); return buildString("");
} }
if (utils::typeassert(state, args, string)) { if (utils::typeassert(state, args, string)) {
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
uint8_t* newptr = copyStr(str, 0, str.length); uint8_t* newptr = copyStr(str, 0, str.length);
std::transform(newptr, newptr + str.length, newptr, toupper); std::transform(newptr, newptr + str.length, newptr, toupper);
dms_string* newstr = new dms_string{ str.length, newptr }; dms_string* newstr = new dms_string{ str.length, newptr };
@ -71,7 +71,7 @@ namespace dms::string_utils {
return buildString(""); return buildString("");
} }
if (utils::typeassert(state, args, string)) { if (utils::typeassert(state, args, string)) {
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
uint8_t* newptr = copyStr(str, 0, str.length); uint8_t* newptr = copyStr(str, 0, str.length);
std::transform(newptr, newptr + str.length, newptr, tolower); std::transform(newptr, newptr + str.length, newptr, tolower);
dms_string* newstr = new dms_string{ str.length, newptr }; dms_string* newstr = new dms_string{ str.length, newptr };
@ -86,8 +86,8 @@ namespace dms::string_utils {
return buildBool(false); return buildBool(false);
} }
if (utils::typeassert(state, args, string, string)) { if (utils::typeassert(state, args, string, string)) {
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
dms_string starts = *args.args[1].s; dms_string starts = *args.args[1]->s;
if (starts.length > str.length) if (starts.length > str.length)
return buildBool(false); return buildBool(false);
for (int i = 0; i < starts.length; i++) { for (int i = 0; i < starts.length; i++) {
@ -106,8 +106,8 @@ namespace dms::string_utils {
return buildBool(false); return buildBool(false);
} }
if (utils::typeassert(state, args, string, string)) { if (utils::typeassert(state, args, string, string)) {
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
dms_string ends = *args.args[1].s; dms_string ends = *args.args[1]->s;
if (ends.length > str.length) if (ends.length > str.length)
return buildBool(false); return buildBool(false);
for (int i = ends.length - 1; i >= 0; i--) { for (int i = ends.length - 1; i >= 0; i--) {
@ -129,8 +129,8 @@ namespace dms::string_utils {
if (utils::typeassert(state, args, string, string)) { if (utils::typeassert(state, args, string, string)) {
bool check = false; bool check = false;
int ind; int ind;
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
dms_string find = *args.args[1].s; dms_string find = *args.args[1]->s;
for (int i = 0; i < str.length; i++) { for (int i = 0; i < str.length; i++) {
for (int ii = 0; ii < find.length; ii++) { for (int ii = 0; ii < find.length; ii++) {
if (find.val[ii] == str.val[i + ii]) { if (find.val[ii] == str.val[i + ii]) {
@ -176,8 +176,8 @@ namespace dms::string_utils {
return buildString(""); return buildString("");
} }
if (utils::typeassert(state, args, string, number)) { if (utils::typeassert(state, args, string, number)) {
dms_string str = *args.args[0].s; dms_string str = *args.args[0]->s;
dms_number num = *args.args[1].n; dms_number num = *args.args[1]->n;
std::string newstr = str.getValue(); std::string newstr = str.getValue();
std::stringstream temp; std::stringstream temp;
for (int i = 0; i < num.getValue(); i++) for (int i = 0; i < num.getValue(); i++)

View File

@ -6,12 +6,15 @@ version 1.2
using extendedDefine using extendedDefine
[Ryan:char] [Ryan:char]
name = "Ryan"
age = 21 age = 21
money = 1000
[step:function(a,b,c)] [step:function(a,b,c)]
"Testing..." "Testing..."
d = (100 + b) / c nil d = (100 + b) / c
e = nil
f = true
g = false
return d return d
[main] [main]
@ -27,7 +30,7 @@ using extendedDefine
hi = {1,2,3} hi = {1,2,3}
list,test = {{1,2+food,hi[3]},true,tester,123,"This is a string!",false, {3,2,1}},5 list = {{1,2+food,hi[3]},true,tester,123,"This is a string!",false, {3,2,1}}
a = list[1] a = list[1]
hungry = (-2+4-((5*5)/sqrt(144+5)))^2*2+2 hungry = (-2+4-((5*5)/sqrt(144+5)))^2*2+2
@ -73,7 +76,7 @@ using extendedDefine
"That Block" "That Block"
"ah this is why no pop" "ah this is why no pop"
[Ryan:char] [Bob:char]
age = 24 age = 24
money = 100 money = 100

View File

@ -41,12 +41,12 @@ namespace dms::utils {
datatypes types[12] = { t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12 }; datatypes types[12] = { t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12 };
if(size >= 4) if(size >= 4)
for (size_t i = 0; i < 4;i++) { for (size_t i = 0; i < 4;i++) {
if (args.args[i].type != types[i]) if (args.args[i]->type != types[i])
return false; return false;
} }
else else
for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) {
if (args.args[i].type != types[i]) if (args.args[i]->type != types[i])
return false; return false;
} }
return true; return true;
@ -56,15 +56,15 @@ namespace dms::utils {
datatypes types[12] = { t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12 }; datatypes types[12] = { t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12 };
if (size >= 4) if (size >= 4)
for (size_t i = 0; i < 4; i++) { for (size_t i = 0; i < 4; i++) {
if (args.args[i].type != types[i]) { if (args.args[i]->type != types[i]) {
state->push_error(dms::errors::error{ errors::invalid_arguments, "Invalid arguments! Expected (" + resolveTypes(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) + ") Got: " + resolveTypes(args.args[i].type)}); state->push_error(dms::errors::error{ errors::invalid_arguments, "Invalid arguments! Expected (" + resolveTypes(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) + ") Got: " + resolveTypes(args.args[i]->type)});
return false; return false;
} }
} }
else else
for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) {
if (args.args[i].type != types[i]) { if (args.args[i]->type != types[i]) {
state->push_error(dms::errors::error{ errors::invalid_arguments, "Invalid arguments! Expected (" + resolveTypes(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) + ") Got: " + resolveTypes(args.args[i].type)}); state->push_error(dms::errors::error{ errors::invalid_arguments, "Invalid arguments! Expected (" + resolveTypes(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) + ") Got: " + resolveTypes(args.args[i]->type)});
return false; return false;
} }
} }

View File

@ -5,7 +5,7 @@
#include <map> #include <map>
#include <vector> #include <vector>
namespace dms { namespace dms {
void dms_args::push(value val) { void dms_args::push(value* val) {
args.push_back(val); args.push_back(val);
} }
dms_string* buildString(std::string str) { dms_string* buildString(std::string str) {
@ -62,68 +62,32 @@ namespace dms {
e = nullptr; e = nullptr;
c = nullptr; c = nullptr;
} }
bool value::typeMatch(const value o) const { // Fixed issue with memory not properly being cleaned up
return type == o.type; bool value::typeMatch(const value* o) const {
return type == o->type;
} }
void value::set(dms_string* str) { void value::set(dms_string* str) {
nuke();
s = str; s = str;
delete[] b;
delete[] n;
delete[] e;
delete[] c;
b = nullptr;
n = nullptr;
e = nullptr;
c = nullptr;
type = string; type = string;
} }
void value::set(dms_boolean* bo) { void value::set(dms_boolean* bo) {
nuke();
b = bo; b = bo;
delete[] s;
delete[] n;
delete[] e;
delete[] c;
s = nullptr;
n = nullptr;
e = nullptr;
c = nullptr;
type = boolean; type = boolean;
} }
void value::set(dms_number* num) { void value::set(dms_number* num) {
nuke();
n = num; n = num;
delete[] b;
delete[] s;
delete[] e;
delete[] c;
b = nullptr;
s = nullptr;
e = nullptr;
c = nullptr;
type = number; type = number;
} }
void dms::value::set(dms_env* en) { void dms::value::set(dms_env* en) {
nuke();
e = en; e = en;
delete[] b;
delete[] s;
delete[] n;
delete[] c;
b = nullptr;
n = nullptr;
s = nullptr;
c = nullptr;
type = env; type = env;
} }
void value::set() { void value::set() {
delete[] b; nuke();
delete[] s;
delete[] n;
delete[] e;
delete[] c;
s = nullptr;
n = nullptr;
e = nullptr;
c = nullptr;
b = nullptr;
type = nil; type = nil;
} }
std::string dms_string::getValue() { std::string dms_string::getValue() {
@ -133,42 +97,44 @@ namespace dms {
} }
return temp.str(); return temp.str();
} }
void dms_env::pushValue(value val) { void dms_env::pushValue(value* val) {
double count = 0; double count = 0;
while (ipart[count++].type != nil) {} while (ipart[count++]->type != nil) {}
ipart.insert_or_assign(count-1, val); ipart.insert_or_assign(count-1, val);
} }
void dms_env::pushValue(value ind, value val) { void dms_env::pushValue(value* ind, value* val) {
if (ind.type == number) { if (ind->type == number) {
size_t size = ipart.size(); size_t size = ipart.size();
if (val.type == nil) { if (val->type == nil) {
ipart.erase(ind.n->val); ipart[ind->n->val]->nuke();
ipart.erase(ind->n->val);
count--; count--;
} }
else { else {
ipart.insert_or_assign(ind.n->val, val); ipart.insert_or_assign(ind->n->val, val);
count++; count++;
} }
} else { } else {
if (val.type == nil) { if (val->type == nil) {
hpart.erase(ind.toString()); hpart[ind->toString()]->nuke();
hpart.erase(ind->toString());
count--; count--;
} }
else { else {
hpart.insert_or_assign(ind.toString(), val); hpart.insert_or_assign(ind->toString(), val);
count++; count++;
} }
} }
} }
value dms_env::getValue(value ind) { value* dms_env::getValue(value* ind) {
if (ind.type == number) { if (ind->type == number) {
return ipart.at(ind.n->getValue()); return ipart.at(ind->n->getValue());
} }
else if (ind.type == number) { else if (ind->type == number) {
return *(new value{}); // Return a nil value return new value{}; // Return a nil value
} }
else { else {
return hpart.at(ind.toString()); return hpart.at(ind->toString());
} }
} }
} }

View File

@ -41,6 +41,9 @@ namespace dms {
dms_boolean* buildBool(bool b); dms_boolean* buildBool(bool b);
dms_number* buildNumber(double num); dms_number* buildNumber(double num);
struct value { struct value {
/*~value() {
nuke();
}*/
datatypes type = nil; datatypes type = nil;
dms_boolean* b = nullptr; dms_boolean* b = nullptr;
dms_number* n = nullptr; dms_number* n = nullptr;
@ -53,19 +56,8 @@ namespace dms {
void set(dms_number* num); void set(dms_number* num);
void set(dms_env* en); void set(dms_env* en);
void set(); void set();
bool typeMatch(const value o) const; bool typeMatch(const value* o) const;
std::string toString() const; std::string toString() const;
friend bool operator<(const value& l, const value& r)
{
if (l.typeMatch(r)) {
if (l.type == number) {
return l.n->val > r.n->val;
}
}
else {
return false; // We might want to throw an error if this were to happen. Mixing incompatable types
}
}
friend std::ostream& operator << (std::ostream& out, const value& c) { friend std::ostream& operator << (std::ostream& out, const value& c) {
if (c.type == string) { if (c.type == string) {
out << c.s->getValue(); out << c.s->getValue();
@ -85,7 +77,7 @@ namespace dms {
else if (c.type == custom) { else if (c.type == custom) {
out << "Custom Data: " << c; out << "Custom Data: " << c;
} }
else if (c.type == variable) { else if (c.type == datatypes::variable) {
out << c.s->getValue(); // Do the lookup out << c.s->getValue(); // Do the lookup
} }
return out; return out;
@ -97,8 +89,8 @@ namespace dms {
value* buildValue(bool b); value* buildValue(bool b);
struct dms_args { struct dms_args {
std::vector<value> args; std::vector<value*> args;
void push(value val); void push(value* val);
friend std::ostream& operator << (std::ostream& out, const dms_args& c) { friend std::ostream& operator << (std::ostream& out, const dms_args& c) {
for (size_t i=0; i < c.args.size(); i++) { for (size_t i=0; i < c.args.size(); i++) {
if(i==c.args.size()-1) if(i==c.args.size()-1)
@ -111,11 +103,11 @@ namespace dms {
}; };
struct dms_env struct dms_env
{ {
std::map<std::string, value> hpart; std::map<std::string, value*> hpart;
std::map<double, value> ipart; std::map<double, value*> ipart;
void pushValue(value val); void pushValue(value* val);
void pushValue(value ind, value val); void pushValue(value* ind, value* val);
value getValue(value val); value* getValue(value* val);
private: private:
size_t count = 0; size_t count = 0;
}; };

Binary file not shown.

Binary file not shown.

Binary file not shown.