Blocks finished, progress on commands starts

This commit is contained in:
Ryan Wardm 2020-08-10 21:55:32 -04:00
parent 04eb7ba944
commit c1b97b83a3
29 changed files with 344 additions and 178 deletions

View File

@ -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 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.

View File

@ -14,7 +14,7 @@ namespace dms {
token tokenstream::peek() { token tokenstream::peek() {
return this->tokens[pos]; return this->tokens[pos];
} }
std::vector<token> tokenstream::next(tokens::tokentype tk, size_t n) { std::vector<token> tokenstream::next(tokens::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());
@ -86,16 +86,16 @@ 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]); //print(stream.tokens[stream.pos + i].type, " | ", types[i]);
} }
return true; return true;
} }
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;
size_t line=1;
tokenstream stream; tokenstream stream;
stream.init(&toks); stream.init(&toks);
token current = stream.next(); token current = stream.next();
@ -105,7 +105,7 @@ namespace dms {
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) {
std::cout << ""; std::cout << "Error";
} }
codes::op code = current.raw; codes::op code = current.raw;
tokens::tokentype tok = temp[0].type; tokens::tokentype tok = temp[0].type;
@ -129,49 +129,120 @@ namespace dms {
} }
else { else {
std::stringstream str; std::stringstream str;
str << "Expected <FLAG IDENTIFIER> " << " got: " << current << " "; str << "Expected <FLAG IDENTIFIER> " << " got: " << current << temp[0];
state->push_error(errors::error{errors::badtoken,str.str(),true,current.line_num}); 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 //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) {
chunks.insert_or_assign(current_chunk->name, *current_chunk); 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 = new chunk;
stream.next(); // Consume chunk_type = bt_block;
line = stream.next().line_num; // Consume
current_chunk->name = stream.next().name; current_chunk->name = stream.next().name;
stream.next(); // Consume 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)) { else if (match(stream, tokens::newline, tokens::bracketo, tokens::name,tokens::colon,tokens::name, tokens::bracketc)) {
stream.next(); stream.next();
stream.next(); stream.next();
if (current_chunk != nullptr) if (current_chunk != nullptr) {
chunks.insert_or_assign(current_chunk->name, *current_chunk); 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 = new chunk;
current_chunk->name = stream.next().name; current_chunk->name = stream.next().name;
stream.next(); line = stream.next().line_num;
std::string temp = stream.next().name; std::string temp = stream.next().name;
// Characters are a feature I want to have intergrated into the language
if (temp == "char") { if (temp == "char") {
current_chunk->type = bt_character; 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") { else if (temp == "env") {
current_chunk->type = bt_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") { else if (temp == "menu") {
current_chunk->type = bt_menu; current_chunk->type = bt_menu;
chunk_type = bt_menu;
} }
stream.next(); 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<token> 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(); current = stream.next();
} }
chunks.insert_or_assign(current_chunk->name, current_chunk);
return chunks; return chunks;
} }
void LineParser::tolower(std::string &s1) { void LineParser::tolower(std::string &s1) {
@ -224,7 +295,7 @@ namespace dms {
size_t line = 1; size_t line = 1;
while (data != NULL) { while (data != NULL) {
if (data == '/' && stream.peek()=='/') { if (data == '/' && stream.peek()=='/') {
line++; //line++;
stream.next('\n'); // Seek until you find a newline stream.next('\n'); // Seek until you find a newline
} }
else if (data == '\n') { else if (data == '\n') {
@ -398,6 +469,12 @@ namespace dms {
else if (str == "choice") { else if (str == "choice") {
t_vec.push_back(token{ tokens::control,codes::CHOI,"",line }); 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) { 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,str,line });
} }
@ -419,7 +496,8 @@ namespace dms {
outputFile.close(); outputFile.close();
print("Running tokenizer"); print("Running tokenizer");
// Tokens build let's parse // Tokens build let's parse
tokenizer(state, t_vec); std::map<std::string,chunk*> test = tokenizer(state, t_vec);
print(test.size());
return state; return state;
} }
} }

View File

@ -21,7 +21,7 @@ namespace dms {
void init(std::vector<tokens::token>* ptr); void init(std::vector<tokens::token>* ptr);
tokens::token next(); tokens::token next();
tokens::token peek(); tokens::token peek();
std::vector<tokens::token> next(tokens::tokentype tk, size_t n=0); std::vector<tokens::token> next(tokens::tokentype tk);
}; };
struct passer { struct passer {
std::string stream; 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 //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);
void tolower(std::string &str); void tolower(std::string &str);
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

@ -12,9 +12,11 @@ namespace dms {
struct chunk struct chunk
{ {
blocktype type = bt_block; blocktype type = bt_block;
dms_args params;
std::string name = ""; std::string name = "";
std::vector<cmd> cmds = std::vector<cmd>(); std::vector<cmd> cmds = std::vector<cmd>();
size_t pos = 0; size_t pos = 0;
size_t line = 0;
void addCmd(cmd c); void addCmd(cmd c);
}; };
} }

View File

@ -1,3 +1,3 @@
#pragma once #pragma once
#include "Codes.h" #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" }; 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" };

View File

@ -30,7 +30,8 @@ namespace dms::codes {
INDX, INDX,
JMPZ, JMPZ,
INST, INST,
ERRO ERRO,
RETN
}; };
extern const std::string list[]; extern const std::string list[];
static bool isControl(const op code) { static bool isControl(const op code) {

View File

@ -1 +1,12 @@
#include "dms_state.h" #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);
}
}

View File

@ -2,11 +2,13 @@
#include <string> #include <string>
#include "errors.h" #include "errors.h"
#include <map> #include <map>
#include <iostream>
namespace dms { namespace dms {
class dms_state class dms_state
{ {
public: public:
void push_error(errors::error err) {}; void push_error(errors::error err);
void push_warning(errors::error err);
double version=1.0; double version=1.0;
std::string entry = "start"; std::string entry = "start";
std::map<std::string, bool> enables; std::map<std::string, bool> enables;

View File

@ -5,193 +5,207 @@ Line <1>NOOP newline
Line <2>ENAB flag Line <2>ENAB flag
Line <2>NOOP name warnings Line <2>NOOP name warnings
Line <2>NOOP newline Line <2>NOOP newline
Line <3>NOOP newline
Line <4>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 <6>NOOP newline
Line <7>VERN flag
Line <7>NOOP number 1.2
Line <7>NOOP newline Line <7>NOOP newline
Line <8>USIN flag Line <8>NOOP bracketo
Line <8>NOOP name extendedDefine Line <8>NOOP name Ryan
Line <8>NOOP colon
Line <8>NOOP name char
Line <8>NOOP bracketc
Line <8>NOOP newline 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 <9>NOOP newline
Line <10>NOOP bracketo Line <10>NOOP tab
Line <10>NOOP name Ryan Line <10>NOOP name age
Line <10>NOOP colon Line <10>NOOP equal
Line <10>NOOP name char Line <10>NOOP number 21
Line <10>NOOP bracketc
Line <10>NOOP cbracketo
Line <10>NOOP newline 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 <11>NOOP newline
Line <12>NOOP tab Line <12>NOOP bracketo
Line <12>NOOP name age Line <12>NOOP name step
Line <12>NOOP equal Line <12>NOOP colon
Line <12>NOOP number 21 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 <12>NOOP newline
Line <13>NOOP cbracketc Line <13>NOOP tab
Line <13>NOOP string Testing...
Line <13>NOOP newline 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 <14>NOOP newline
Line <15>NOOP bracketo Line <15>NOOP tab
Line <15>NOOP name main Line <15>RETN ret
Line <15>NOOP bracketc Line <15>NOOP name d
Line <15>NOOP newline Line <15>NOOP newline
Line <16>NOOP tab
Line <16>NOOP string This works!
Line <16>NOOP newline Line <16>NOOP newline
Line <17>NOOP tab Line <17>NOOP bracketo
Line <17>NOOP string What's up Line <17>NOOP name main
Line <17>NOOP bracketc
Line <17>NOOP newline Line <17>NOOP newline
Line <18>NOOP tab
Line <18>NOOP string This works!
Line <18>NOOP newline Line <18>NOOP newline
Line <19>NOOP tab Line <19>NOOP tab
Line <19>NOOP name ryan Line <19>NOOP string What's up
Line <19>NOOP string Hello "how" are you doing? Line <19>NOOP newline
Line <20>NOOP newline Line <20>NOOP newline
Line <21>NOOP tab Line <21>NOOP tab
Line <21>NOOP name bob Line <21>NOOP name ryan
Line <21>NOOP string I'm good you? 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 I'm good you?
Line <22>NOOP newline Line <22>NOOP newline
Line <23>NOOP tab Line <23>NOOP tab
Line <23>NOOP name tester
Line <23>NOOP equal
Line <23>NOOP string Hello
Line <23>NOOP newline Line <23>NOOP newline
Line <24>NOOP tab Line <24>NOOP tab
Line <24>NOOP name tester
Line <24>NOOP equal
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 food
Line <25>NOOP equal
Line <25>NOOP number 3
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 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 <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 <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 <29>NOOP newline
Line <30>NOOP tab Line <30>NOOP tab
Line <30>NOOP name a
Line <30>NOOP equal
Line <30>NOOP name list 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 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 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 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 <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 <32>NOOP newline
Line <33>NOOP tab Line <33>NOOP tab
Line <33>NOOP name list Line <33>NOOP name hungry
Line <33>NOOP bracketo
Line <33>NOOP number 1
Line <33>NOOP bracketc
Line <33>NOOP equal 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 <33>NOOP newline
Line <34>NOOP tab Line <34>NOOP tab
Line <34>NOOP number var1 Line <34>NOOP name list
Line <34>NOOP seperator Line <34>NOOP bracketo
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 number 1 Line <34>NOOP number 1
Line <34>NOOP seperator Line <34>NOOP bracketc
Line <34>NOOP string string Line <34>NOOP equal
Line <34>NOOP seperator Line <34>NOOP string Hello
Line <34>NOOP number 2
Line <34>NOOP plus
Line <34>NOOP number 5
Line <34>NOOP parac
Line <34>NOOP newline Line <34>NOOP newline
Line <35>NOOP tab Line <35>NOOP tab
Line <35>NOOP name a Line <35>NOOP number var1
Line <35>NOOP equal Line <35>NOOP seperator
Line <35>NOOP name 100 Line <35>NOOP name var2
Line <35>NOOP number Line <35>NOOP number
Line <35>NOOP plus Line <35>NOOP equal
Line <35>NOOP name func Line <35>NOOP name func
Line <35>NOOP parao Line <35>NOOP parao
Line <35>NOOP number 1 Line <35>NOOP number 1
@ -202,10 +216,13 @@ Line <35>NOOP number 2
Line <35>NOOP plus Line <35>NOOP plus
Line <35>NOOP number 5 Line <35>NOOP number 5
Line <35>NOOP parac Line <35>NOOP parac
Line <35>NOOP plus
Line <35>NOOP number 100
Line <35>NOOP newline Line <35>NOOP newline
Line <36>NOOP tab 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 name func
Line <36>NOOP parao Line <36>NOOP parao
Line <36>NOOP number 1 Line <36>NOOP number 1
@ -216,11 +233,25 @@ Line <36>NOOP number 2
Line <36>NOOP plus 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 plus
Line <36>NOOP number 100
Line <36>NOOP newline Line <36>NOOP newline
Line <37>NOOP tab 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 <37>NOOP newline
Line <38>NOOP tab Line <38>NOOP tab
Line <38>NOOP label label
Line <38>NOOP newline
Line <39>NOOP tab
Line <39>NOOP newline Line <39>NOOP newline
Line <40>NOOP tab Line <40>NOOP tab
Line <40>NOOP newline Line <40>NOOP newline

View File

@ -7,7 +7,8 @@ namespace dms::errors {
invalid_arguments, invalid_arguments,
invalie_type, invalie_type,
array_out_of_bounds, array_out_of_bounds,
badtoken badtoken,
block_already_defined
}; };
struct error { struct error {
errortype code=unknown; errortype code=unknown;

View File

@ -5,10 +5,14 @@ enable warnings
version 1.2 version 1.2
using extendedDefine using extendedDefine
[Ryan:char]{ [Ryan:char]
name = "Ryan" name = "Ryan"
age = 21 age = 21
}
[step:function(a,b,c)]
"Testing..."
d = (100 + b) / c nil
return d
[main] [main]
"This works!" "This works!"

View File

@ -35,7 +35,9 @@ namespace dms::tokens {
label, label,
newline, newline,
tab, tab,
eof eof,
ret,
nil
};//stream, t_vec, line, isNum, buffer };//stream, t_vec, line, isNum, buffer
struct token { struct token {
tokentype type = noop; tokentype type = noop;
@ -89,7 +91,9 @@ namespace dms::tokens {
"label", "label",
"newline", "newline",
"tab", "tab",
"eof" "eof",
"ret",
"nil"
}; };
out << "Line <" << c.line_num << ">" << codes::list[c.raw] << " " << temp1[c.type] << " \t\t " << c.name; out << "Line <" << c.line_num << ">" << codes::list[c.raw] << " " << temp1[c.type] << " \t\t " << c.name;
return out; return out;

View File

@ -5,6 +5,9 @@
#include <map> #include <map>
#include <vector> #include <vector>
namespace dms { namespace dms {
void dms_args::push(value val) {
args.push_back(val);
}
dms_string* buildString(std::string str) { dms_string* buildString(std::string str) {
size_t len = str.length(); size_t len = str.length();
uint8_t* arr = new uint8_t[len]; uint8_t* arr = new uint8_t[len];
@ -22,7 +25,7 @@ namespace dms {
dms_number* dms_num = new dms_number{ num }; dms_number* dms_num = new dms_number{ num };
return dms_num; return dms_num;
} }
std::string value::toString() { std::string value::toString() const {
std::stringstream temp; std::stringstream temp;
temp << this; temp << this;
return temp.str(); return temp.str();
@ -47,6 +50,18 @@ namespace dms {
val->set(buildBool(b)); val->set(buildBool(b));
return val; 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 { bool value::typeMatch(const value o) const {
return type == o.type; return type == o.type;
} }

View File

@ -6,7 +6,7 @@
namespace dms { namespace dms {
struct dms_env; struct dms_env;
enum datatypes { nil, number, boolean, env, string, custom }; enum datatypes { nil, number, boolean, env, string, custom, variable };
struct dms_number { struct dms_number {
double val; double val;
double getValue() { return val; } double getValue() { return val; }
@ -47,13 +47,14 @@ namespace dms {
dms_string* s = nullptr; dms_string* s = nullptr;
dms_env* e = nullptr; dms_env* e = nullptr;
dms_custom* c = nullptr; dms_custom* c = nullptr;
void nuke();
void set(dms_string* str); void set(dms_string* str);
void set(dms_boolean* bo); void set(dms_boolean* bo);
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(); std::string toString() const;
friend bool operator<(const value& l, const value& r) friend bool operator<(const value& l, const value& r)
{ {
if (l.typeMatch(r)) { if (l.typeMatch(r)) {
@ -84,6 +85,9 @@ 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) {
out << c.s->getValue(); // Do the lookup
}
return out; return out;
}; };
}; };
@ -94,6 +98,16 @@ namespace dms {
struct dms_args { struct dms_args {
std::vector<value> args; std::vector<value> 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 struct dms_env
{ {

Binary file not shown.

Binary file not shown.

Binary file not shown.