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