Started working on envs, added new handles

This commit is contained in:
Ryan Ward 2020-10-02 23:33:38 -04:00
parent 9a49433e7e
commit 35c0b390ab
19 changed files with 359 additions and 166 deletions

View File

@ -2,16 +2,12 @@
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include "value.h" #include "value.h"
#include "enviroment.h"
namespace dms { namespace dms {
struct character { struct character : enviroment {
std::string fname = "";
std::string lname = "";
std::string unknown = "Unknown";
std::string nickname = "";
bool seen = false; bool seen = false;
double spd = 100; double spd = 100;
std::unordered_map<std::string, std::string> paths; std::unordered_map<std::string, std::string> paths;
std::unordered_map<std::string, value*> values;
std::string getName(); std::string getName();
}; };
} }

View File

@ -1,28 +1,11 @@
#include "dms.h" #include "dms.h"
#include <iostream> #include <iostream>
using namespace dms; using namespace dms;
// You can use your own choice handler!
class myHandler : public Handler {
uint8_t handleChoice(dms_state* state, std::string prompt, std::vector<std::string> args) const override {
std::string pos;
for (size_t i = 0; i < args.size(); i++)
std::cout << i << ": " << args[i] << std::endl;
std::cout << prompt << " ";
std::cin >> pos;
return std::stoi(pos) - 1;
}
};
int main() int main()
{ {
LineParser parser = LineParser("test.dms"); LineParser parser = LineParser("test.dms");
dms_state* state = parser.Parse(); dms_state* state = parser.Parse();
try {
//state->setHandler(new myHandler);
}
catch (std::exception& e) {
std::cout << e.what() << '\n';
return -1;
}
state->dump(); state->dump();
state->run(); state->run();
utils::print("Exitcode: ",state->exitcode);
} }

View File

@ -133,6 +133,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>

View File

@ -20,22 +20,26 @@ namespace dms {
bool Handler::handleSpeaker(dms_state* state, character* speaker) const { bool Handler::handleSpeaker(dms_state* state, character* speaker) const {
if (speaker == nullptr) if (speaker == nullptr)
return false; // Something went wrong and we pushed the error! return false; // Something went wrong and we pushed the error!
if (speaker->seen) { utils::write(speaker->getName(), ": ");
if (speaker->lname != "") { return true;
utils::write(speaker->fname, " ", speaker->lname, ": "); }
}
else { bool Handler::handleMessageDisplay(dms_state* state, std::string msg) const {
utils::write(speaker->fname, ": "); utils::write(msg);
} return true;
} }
else {
utils::write(speaker->unknown, ": "); bool Handler::handleMessageAppend(dms_state* state, std::string msg) const {
speaker->seen = true; utils::write(msg);
} return true;
} }
// Simple one conn event // Simple one conn event
bool Handler::OnSpeakerCreated(dms_state* state, character* chara) const { bool Handler::OnSpeakerCreated(dms_state* state, character* chara) const {
return true; return true;
} }
bool Handler::OnStateInit(dms_state* state) const {
return true;
}
} }

View File

@ -8,9 +8,12 @@ namespace dms {
{ {
virtual uint8_t handleChoice(dms_state* state, std::string prompt, std::vector<std::string> args) const; virtual uint8_t handleChoice(dms_state* state, std::string prompt, std::vector<std::string> args) const;
virtual bool handleSpeaker(dms_state* state, character* chara) const; virtual bool handleSpeaker(dms_state* state, character* chara) const;
virtual bool handleMessageDisplay(dms_state* state, std::string msg) const;
virtual bool handleMessageAppend(dms_state* state, std::string msg) const;
//virtual bool manageMessage(dms_state* state, value* msg) const; //virtual bool manageMessage(dms_state* state, value* msg) const;
// Simple Events: only one connector! // Simple Events: only one connector!
virtual bool OnSpeakerCreated(dms_state* state, character* chara) const; virtual bool OnSpeakerCreated(dms_state* state, character* chara) const;
virtual bool OnStateInit(dms_state* state) const;
}; };
} }

View File

@ -72,6 +72,7 @@ namespace dms {
bool match_process_IFFF(tokenstream* stream); bool match_process_IFFF(tokenstream* stream);
bool match_process_assignment(tokenstream* stream); bool match_process_assignment(tokenstream* stream);
bool match_process_list(tokenstream* stream, value* v = nullptr); bool match_process_list(tokenstream* stream, value* v = nullptr);
bool match_process_wait(tokenstream* stream);
bool match_process_standard(tokenstream* stream, value* v = nullptr); // All types that are matchable are handled here! bool match_process_standard(tokenstream* stream, value* v = nullptr); // All types that are matchable are handled here!

View File

@ -565,6 +565,7 @@ namespace dms {
} }
bool LineParser::match_process_exit(tokenstream* stream) { bool LineParser::match_process_exit(tokenstream* stream) {
if (stream->match(tokens::exit)) { if (stream->match(tokens::exit)) {
stream->next();
cmd* c = new cmd; cmd* c = new cmd;
c->opcode = codes::EXIT; c->opcode = codes::EXIT;
if (stream->match(tokens::number) || stream->match(tokens::name)) { if (stream->match(tokens::number) || stream->match(tokens::name)) {
@ -583,11 +584,26 @@ namespace dms {
bool LineParser::match_process_IFFF(tokenstream* stream) { bool LineParser::match_process_IFFF(tokenstream* stream) {
return false; // TODO finish this return false; // TODO finish this
} }
void reset(value*& l,codes::op& op, value*& r) {
bool LineParser::match_process_wait(tokenstream* stream) {
if (stream->match(tokens::name, tokens::number)) {
if (stream->peek().name == "wait") {
stream->next();
buildWait(std::stod(stream->next().name));
}
else {
return false;
}
}
return false;
}
void reset(value*& l, codes::op& op, value*& r) {
l = nullptr; l = nullptr;
op = codes::NOOP; op = codes::NOOP;
r = nullptr; r = nullptr;
} }
bool LineParser::match_process_expression(tokenstream* stream, value* v) { bool LineParser::match_process_expression(tokenstream* stream, value* v) {
// I will have to consume for this to work so we need to keep track of what was incase we return false! // I will have to consume for this to work so we need to keep track of what was incase we return false!
stream->store(current_chunk); stream->store(current_chunk);

View File

@ -321,27 +321,7 @@ namespace dms {
// Tokens build let's parse // Tokens build let's parse
tokenizer(state, t_vec); tokenizer(state, t_vec);
if (isFirst) { if (isFirst) {
cmd* c = new cmd; state->init();
for (const auto& [key, val] : state->chunks) {
if (val->type == blocktype::bt_character) {
value* v = buildVariable();
v->set(buildString(key));
v->type = datatypes::block;
c->opcode = codes::ASGN;
c->args.push(buildVariable(key));
c->args.push(v);
state->chunks["$INIT"]->addCmd(c);
c = new cmd;
}
}
c->opcode = codes::JUMP;
if (state->entry != "$undefined")
c->args.push(buildValue(state->entry));
else
c->args.push(buildValue(state->chunks.begin()->first));
state->chunks["$INIT"]->addCmd(c);
} }
return state; return state;
} }
@ -374,7 +354,6 @@ namespace dms {
current_chunk->addCmd(c); current_chunk->addCmd(c);
} }
while (stream->peek().type != tokens::eof) { while (stream->peek().type != tokens::eof) {
//print(stream->peek());
debugInvoker(stream); debugInvoker(stream);
if (current.type == tokens::flag) { if (current.type == tokens::flag) {
temp = stream->next(tokens::newline); temp = stream->next(tokens::newline);
@ -519,6 +498,8 @@ namespace dms {
match_process_debug(stream); match_process_debug(stream);
match_process_goto(stream); match_process_goto(stream);
match_process_exit(stream);
match_process_wait(stream);
match_process_jump(stream); match_process_jump(stream);
current = stream->next(); current = stream->next();
} }

View File

@ -2,17 +2,17 @@
#include "utils.h" #include "utils.h"
namespace dms { namespace dms {
std::string character::getName() { std::string character::getName() {
if (nickname != "") { if (values.count("nickname")) {
return nickname; return values["nickname"]->getPrintable();
} }
if (seen && lname !="") { if (seen && values.count("lname")) {
return utils::concat(fname," ", lname); return utils::concat(values["fname"]->getPrintable()," ", values["lname"]->getPrintable());
} }
else if (seen) { else if (seen) {
return utils::concat(fname); return utils::concat(values["fname"]->getPrintable());
} }
else { else {
return unknown; return values["unknown"]->getPrintable();
} }
} }
} }

View File

@ -1,6 +1,34 @@
#include "dms_state.h" #include "dms_state.h"
#include "Handlers.h" #include "Handlers.h"
namespace dms { namespace dms {
void dms_state::init() {
if (init_init)
return;
init_init = true;
cmd* c = new cmd;
for (const auto& [key, val] : chunks) {
if (val->type == blocktype::bt_character) {
value* v = buildVariable();
v->set(buildString(key));
v->type = datatypes::block;
c->opcode = codes::ASGN;
c->args.push(buildVariable(key));
c->args.push(v);
chunks["$INIT"]->addCmd(c);
c = new cmd;
}
}
c->opcode = codes::JUMP;
if (entry != "$undefined")
c->args.push(buildValue(entry));
else
c->args.push(buildValue(chunks.begin()->first));
chunks["$INIT"]->addCmd(c);
if (!handler->OnStateInit(this))
stop = true;
}
dms_state::dms_state() { dms_state::dms_state() {
// We should define the defaults for the enables // We should define the defaults for the enables
enables.insert_or_assign("leaking",false); enables.insert_or_assign("leaking",false);
@ -56,6 +84,14 @@ namespace dms {
} }
outputFile.close(); outputFile.close();
} }
bool dms_state::hasError() {
return stop;
}
bool dms_state::Inject(std::string var, value* val) {
return false;
}
bool dms_state::assign(value* var, value* val) { bool dms_state::assign(value* var, value* val) {
if (memory.count(var->s->getValue()) == 0) { if (memory.count(var->s->getValue()) == 0) {
memory.insert_or_assign(var->s->getValue(), val); memory.insert_or_assign(var->s->getValue(), val);

View File

@ -12,23 +12,26 @@
#include <mutex> #include <mutex>
#include <chrono> #include <chrono>
#include "Character.h" #include "Character.h"
#include "enviroment.h"
namespace dms { namespace dms {
struct Handler;
struct dms_state struct dms_state
{ {
void* handler = nullptr; Handler* handler = nullptr;
bool hasFirst = false; bool hasFirst = false;
std::unordered_map<std::string, value*> memory; std::unordered_map<std::string, value*> memory;
std::vector<value*> garbage; std::vector<value*> garbage;
std::map<std::string, chunk*> chunks; std::map<std::string, chunk*> chunks;
std::map<std::string, character*> characters; std::map<std::string, character*> characters;
std::map<std::string, enviroment*> enviroments;
std::map<std::string, size_t> labels; std::map<std::string, size_t> labels;
std::string entry = "$undefined"; std::string entry = "$undefined";
std::map<std::string, bool> enables; std::map<std::string, bool> enables;
std::size_t cur_line=0; std::size_t cur_line=0;
int exitcode = 0;
const double Iversion = 1.0; const double Iversion = 1.0;
double Sversion; // The version of double Sversion; // The version of
errors::error err; errors::error err;
bool stop = false;
dms_state(); dms_state();
void dump(errors::error err); void dump(errors::error err);
@ -37,14 +40,18 @@ namespace dms {
void push_warning(errors::error err); void push_warning(errors::error err);
void push_chunk(std::string s, chunk* c); void push_chunk(std::string s, chunk* c);
bool run(std::string instance); bool run(std::string instance);
double version=1.0; double version = 1.0;
void enable(std::string flag); void enable(std::string flag);
void disable(std::string flag); void disable(std::string flag);
bool isEnabled(std::string flag); bool isEnabled(std::string flag);
void setHandler(void* hand);
void setHandler(Handler* hand);
bool Inject(std::string var, value* val);
// Gets or creates a character // Gets or creates a character
character* getCharacter(std::string c); character* getCharacter(std::string c);
enviroment* getEnviroment(std::string c);
bool assign(value* var, value* val); bool assign(value* var, value* val);
size_t seek(std::string label,std::vector<cmd*> cmds ,codes::op code, size_t pos); size_t seek(std::string label,std::vector<cmd*> cmds ,codes::op code, size_t pos);
@ -52,9 +59,15 @@ namespace dms {
bool blockExists(std::string bk_name); bool blockExists(std::string bk_name);
bool typeAssert(value* val, datatypes type); bool typeAssert(value* val, datatypes type);
bool run(); bool run();
// This is called once and once only. Dynamically loading code is not a thing!
void init();
bool hasError();
private: private:
// From what I gathered // From what I gathered
//std::mutex memory_mutex; //std::mutex memory_mutex;
bool stop = 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);
}; };
} }

View File

@ -8,9 +8,12 @@ using namespace dms::exceptions;
using namespace dms::codes; using namespace dms::codes;
namespace dms { namespace dms {
// This is a pointer to a choicehandler! dms_state and utils have codepedencies, so I have to do this. // This is a pointer to a choicehandler! dms_state and utils have codepedencies, so I have to do this.
void dms_state::setHandler(void* hand) { void dms_state::setHandler(Handler* hand) {
this->handler = hand; this->handler = hand;
} }
enviroment* dms_state::getEnviroment(std::string c) {
return nullptr;
}
character* dms_state::getCharacter(std::string cha) { character* dms_state::getCharacter(std::string cha) {
if (characters.count(cha)) { if (characters.count(cha)) {
return characters[cha]; return characters[cha];
@ -18,7 +21,8 @@ namespace dms {
else { else {
if (blockExists(cha)) { if (blockExists(cha)) {
character* cc = new character; character* cc = new character;
cc->fname = cha; cc->values.insert_or_assign("fname", buildValue(cha));
cc->values.insert_or_assign("lname", buildValue(""));
codes::op code; codes::op code;
cmd* c = nullptr; cmd* c = nullptr;
bool halt = false; bool halt = false;
@ -49,19 +53,19 @@ namespace dms {
if (c->args.args[0]->s->getValue() == "fname") { if (c->args.args[0]->s->getValue() == "fname") {
if(!typeAssert(c->args.args[1],datatypes::string)) if(!typeAssert(c->args.args[1],datatypes::string))
return nullptr; return nullptr;
cc->fname = c->args.args[1]->s->getValue(); cc->values.insert_or_assign("fname", c->args.args[1]);
} }
else if (c->args.args[0]->s->getValue() == "lname" && c->args.args[1]->type == datatypes::string) { else if (c->args.args[0]->s->getValue() == "lname") {
if (!typeAssert(c->args.args[1], datatypes::string)) if (!typeAssert(c->args.args[1], datatypes::string))
return nullptr; return nullptr;
cc->lname = c->args.args[1]->s->getValue(); cc->values.insert_or_assign("lname", c->args.args[1]);
} }
else if (c->args.args[0]->s->getValue() == "unknown" && c->args.args[1]->type == datatypes::string) { else if (c->args.args[0]->s->getValue() == "unknown") {
if (!typeAssert(c->args.args[1], datatypes::string)) if (!typeAssert(c->args.args[1], datatypes::string))
return nullptr; return nullptr;
cc->unknown = c->args.args[1]->s->getValue(); cc->values.insert_or_assign("unknown", c->args.args[1]);
} }
else if (c->args.args[0]->s->getValue() == "known" && c->args.args[1]->type == datatypes::boolean) { else if (c->args.args[0]->s->getValue() == "known") {
if (!typeAssert(c->args.args[1], datatypes::boolean)) if (!typeAssert(c->args.args[1], datatypes::boolean))
return nullptr; return nullptr;
cc->seen = c->args.args[1]->b->getValue(); cc->seen = c->args.args[1]->b->getValue();
@ -81,7 +85,7 @@ namespace dms {
} }
characters.insert_or_assign(cha, cc); characters.insert_or_assign(cha, cc);
// Call Character event! // Call Character event!
(*(Handler*)handler).OnSpeakerCreated(this,cc); handler->OnSpeakerCreated(this,cc);
return cc; return cc;
} }
else { else {
@ -165,6 +169,12 @@ namespace dms {
// How we add modules into the code. This is the code that actually loads that data! // How we add modules into the code. This is the code that actually loads that data!
break; break;
// Flags handled // Flags handled
case EXIT:
if (c->args.args.size()) {
exitcode = c->args.args[0]->n->getValue();
}
return true;
break;
case LIST: case LIST:
//We need to create an enviroment value then set that //We need to create an enviroment value then set that
{ {
@ -186,6 +196,9 @@ namespace dms {
std::this_thread::sleep_for(std::chrono::milliseconds(700)); std::this_thread::sleep_for(std::chrono::milliseconds(700));
std::cout << std::endl; std::cout << std::endl;
break; break;
case WAIT:
std::this_thread::sleep_for(std::chrono::milliseconds((int)(c->args.args[0]->n->getValue()*1000)));
break;
case DSPD: case DSPD:
if (speaker == nullptr) { if (speaker == nullptr) {
push_error(errors::error{ errors::unknown ,utils::concat("A call to set speaker speed, but a speaker has not been defined!") }); push_error(errors::error{ errors::unknown ,utils::concat("A call to set speaker speed, but a speaker has not been defined!") });
@ -199,7 +212,7 @@ namespace dms {
//Because we are using void* we must cast our pointers //Because we are using void* we must cast our pointers
if (characterExists(c->args.args[0]->s->getValue())){ if (characterExists(c->args.args[0]->s->getValue())){
speaker = getCharacter(c->args.args[0]->s->getValue()); speaker = getCharacter(c->args.args[0]->s->getValue());
if (!(*(Handler*)handler).handleSpeaker(this, speaker)) if (!handler->handleSpeaker(this, speaker))
return false; return false;
} }
else { else {
@ -208,10 +221,12 @@ namespace dms {
} }
break; break;
case APND: case APND:
utils::write(c->args.args[0]->s->getValue(this)); if (!handler->handleMessageAppend(this, c->args.args[0]->s->getValue(this)))
return false;
break; break;
case DISP: case DISP:
utils::write(c->args.args[0]->s->getValue(this)); if (!handler->handleMessageDisplay(this, c->args.args[0]->s->getValue(this)))
return false;
break; break;
case ASGN: case ASGN:
assign(c->args.args[0], c->args.args[1]); assign(c->args.args[0], c->args.args[1]);
@ -229,7 +244,7 @@ namespace dms {
std::string fn = c->args.args[1]->s->getValue(); std::string fn = c->args.args[1]->s->getValue();
for (size_t i = 2; i < c->args.args.size(); i++) for (size_t i = 2; i < c->args.args.size(); i++)
args.push_back(c->args.args[i]->resolve(memory)->s->getValue()); args.push_back(c->args.args[i]->resolve(memory)->s->getValue());
size_t npos = (*(Handler*)handler).handleChoice(this, prompt, args); size_t npos = handler->handleChoice(this, prompt, args);
size_t nnpos = seek(concat("CHOI_", fn, "_", npos),cmds,LABL,npos); size_t nnpos = seek(concat("CHOI_", fn, "_", npos),cmds,LABL,npos);
if (!nnpos) { if (!nnpos) {
push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown choice!") }); push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown choice!") });

Binary file not shown.

View File

@ -52,104 +52,233 @@ Line <15> newline
Line <15> newline Line <15> newline
Line <16> name excited Line <16> name excited
Line <16> colon : Line <16> colon :
Line <16> string Hello `Ryan:fname`! Line <16> string Hello Mr. `Ryan:lname`,
Line <16> newline Line <16> newline
Line <16> newline Line <16> newline
Line <17> name wait Line <17> string how are you doing?
Line <17> number 200
Line <17> newline Line <17> newline
Line <17> newline Line <17> newline
Line <18> string How are you doing? I hear you have $`Ryan:money` in your account, nice! Line <18> cbracketc }
Line <18> newline Line <18> newline
Line <18> newline Line <18> newline
Line <19> cbracketc }
Line <19> newline Line <19> newline
Line <19> newline Line <19> newline
Line <20> newline Line <20> newline
Line <20> newline
Line <21> name Ryan
Line <21> colon :
Line <21> cbracketo {
Line <21> newline Line <21> newline
Line <21> newline Line <21> newline
Line <22> string Hey Bob I'm good how are you? Line <22> name Ryan
Line <22> colon :
Line <22> cbracketo {
Line <22> newline Line <22> newline
Line <22> newline Line <22> newline
Line <23> cbracketc } Line <23> string Hey `Bob`, I'm good how are you?
Line <23> newline Line <23> newline
Line <23> newline Line <23> newline
Line <24> cbracketc }
Line <24> newline Line <24> newline
Line <24> newline
Line <25> name Bob
Line <25> colon :
Line <25> string I am great thanks!
Line <25> newline Line <25> newline
Line <25> newline Line <25> newline
Line <26> string Waiting ...
Line <26> newline Line <26> newline
Line <26> newline Line <26> newline
Line <27> control
Line <27> string What do you want to do?
Line <27> cbracketo {
Line <27> newline Line <27> newline
Line <27> newline Line <27> newline
Line <28> string option 1 Line <28> exit
Line <28> name test2
Line <28> parao (
Line <28> string testing
Line <28> seperator ,
Line <28> cbracketo {
Line <28> number 1 Line <28> number 1
Line <28> seperator ,
Line <28> number 2
Line <28> seperator ,
Line <28> number 3
Line <28> cbracketc }
Line <28> parac )
Line <28> newline Line <28> newline
Line <28> newline Line <28> newline
Line <29> string option 2
Line <29> jump
Line <29> string test
Line <29> newline Line <29> newline
Line <29> newline Line <29> newline
Line <30> string option 3 Line <30> name Bob
Line <30> jump Line <30> colon :
Line <30> name there Line <30> cbracketo {
Line <30> newline Line <30> newline
Line <30> newline Line <30> newline
Line <31> string option 4 Line <31> string I am great thanks! I want to show you that I can count!
Line <31> gotoo
Line <31> string o3
Line <31> newline Line <31> newline
Line <31> newline Line <31> newline
Line <32> string option 5 Line <32> name wait
Line <32> gotoo Line <32> number 1
Line <32> name here
Line <32> newline Line <32> newline
Line <32> newline Line <32> newline
Line <33> string option 6 Line <33> string 1
Line <33> name test
Line <33> parao (
Line <33> string here
Line <33> parac )
Line <33> newline Line <33> newline
Line <33> newline Line <33> newline
Line <34> cbracketc } Line <34> name wait
Line <34> number 1
Line <34> newline Line <34> newline
Line <34> newline Line <34> newline
Line <35> string 2
Line <35> newline Line <35> newline
Line <35> newline Line <35> newline
Line <36> bracketo [ Line <36> name wait
Line <36> name test Line <36> number 1
Line <36> bracketc ]
Line <36> newline Line <36> newline
Line <36> newline Line <36> newline
Line <37> name Ryan Line <37> string 3
Line <37> colon :
Line <37> string We are here now!
Line <37> newline Line <37> newline
Line <37> newline Line <37> newline
Line <38> Line <1> newline Line <38> name wait
Line <38> number 1
Line <38> newline
Line <38> newline
Line <39> string 4
Line <39> newline
Line <39> newline
Line <40> name wait
Line <40> number 1
Line <40> newline
Line <40> newline
Line <41> string 5
Line <41> newline
Line <41> newline
Line <42> cbracketc }
Line <42> newline
Line <42> newline
Line <43> newline
Line <43> newline
Line <44> control
Line <44> string What do you want to do?
Line <44> cbracketo {
Line <44> newline
Line <44> newline
Line <45> string option 1
Line <45> name test2
Line <45> parao (
Line <45> string testing
Line <45> seperator ,
Line <45> cbracketo {
Line <45> number 1
Line <45> seperator ,
Line <45> number 2
Line <45> seperator ,
Line <45> number 3
Line <45> cbracketc }
Line <45> parac )
Line <45> newline
Line <45> newline
Line <46> string option 2
Line <46> jump
Line <46> string test
Line <46> newline
Line <46> newline
Line <47> string option 3
Line <47> jump
Line <47> name there
Line <47> newline
Line <47> newline
Line <48> string option 4
Line <48> gotoo
Line <48> string o3
Line <48> newline
Line <48> newline
Line <49> string option 5
Line <49> gotoo
Line <49> name here
Line <49> newline
Line <49> newline
Line <50> string option 6
Line <50> name test
Line <50> parao (
Line <50> string here
Line <50> parac )
Line <50> newline
Line <50> newline
Line <51> cbracketc }
Line <51> newline
Line <51> newline
Line <52> newline
Line <52> newline
Line <53> bracketo [
Line <53> name test
Line <53> bracketc ]
Line <53> newline
Line <53> newline
Line <54> name Ryan
Line <54> colon :
Line <54> string We are here now!
Line <54> newline
Line <54> newline
Line <55> pipe |
Line <55> string This continues from the last message!
Line <55> newline
Line <55> newline
Line <56> pipe |
Line <56> string Keeps code readable. This does not cause a new line!
Line <56> newline
Line <56> newline
Line <57> name Ryan
Line <57> colon :
Line <57> string This does trigger a new line tho!
Line <57> newline
Line <57> newline
Line <58> string This also will cause a new line!
Line <58> newline
Line <58> newline
Line <59> newline
Line <59> newline
Line <60> bracketo [
Line <60> name Bob
Line <60> colon :
Line <60> name char
Line <60> bracketc ]
Line <60> newline
Line <60> newline
Line <61> name fname
Line <61> equal =
Line <61> string Bob
Line <61> newline
Line <61> newline
Line <62> newline
Line <63> newline
Line <64> name unknown
Line <64> equal =
Line <64> string Some Rando
Line <64> newline
Line <64> newline
Line <65> name age
Line <65> equal =
Line <65> number 0.24
Line <65> newline
Line <65> newline
Line <66> name money
Line <66> equal =
Line <66> number 100
Line <66> newline
Line <66> newline
Line <67> name excited
Line <67> colon :
Line <67> string path/to/file
Line <67> newline
Line <67> newline
Line <68> newline
Line <68> newline
Line <69> bracketo [
Line <69> name newblock
Line <69> colon :
Line <69> name function
Line <69> parao (
Line <69> parac )
Line <69> bracketc ]
Line <69> newline
Line <69> newline
Line <70> string Test #2
Line <70> newline
Line <70> newline
Line <71> string Does it parse this part properly?
Line <71> newline
Line <71> newline
Line <72> string huh
Line <72> newline
Line <72> newline
Line <72> eof
Line <1> newline
Line <1> newline Line <1> newline
Line <1> flag Line <1> flag
Line <1> name tests Line <1> name tests
@ -276,42 +405,42 @@ Line <25> newline
Line <25> newline Line <25> newline
Line <26> name slot1 Line <26> name slot1
Line <26> equal = Line <26> equal =
Line <26> string Line <26> string S1
Line <26> newline Line <26> newline
Line <26> newline Line <26> newline
Line <27> name slot2 Line <27> name slot2
Line <27> equal = Line <27> equal =
Line <27> string Line <27> string S2
Line <27> newline Line <27> newline
Line <27> newline Line <27> newline
Line <28> name slot3 Line <28> name slot3
Line <28> equal = Line <28> equal =
Line <28> string Line <28> string S3
Line <28> newline Line <28> newline
Line <28> newline Line <28> newline
Line <29> name slot4 Line <29> name slot4
Line <29> equal = Line <29> equal =
Line <29> string Line <29> string S4
Line <29> newline Line <29> newline
Line <29> newline Line <29> newline
Line <30> name slot5 Line <30> name slot5
Line <30> equal = Line <30> equal =
Line <30> string Line <30> string S5
Line <30> newline Line <30> newline
Line <30> newline Line <30> newline
Line <31> name slot6 Line <31> name slot6
Line <31> equal = Line <31> equal =
Line <31> string Line <31> string S6
Line <31> newline Line <31> newline
Line <31> newline Line <31> newline
Line <32> name slot7 Line <32> name slot7
Line <32> equal = Line <32> equal =
Line <32> string Line <32> string S7
Line <32> newline Line <32> newline
Line <32> newline Line <32> newline
Line <33> name slot8 Line <33> name slot8
Line <33> equal = Line <33> equal =
Line <33> string Line <33> string S8
Line <33> newline Line <33> newline
Line <33> newline Line <33> newline
Line <33> eof Line <33> eof

View File

@ -3,9 +3,15 @@
#include <unordered_map> #include <unordered_map>
#include "value.h" #include "value.h"
namespace dms { namespace dms {
enum class env_type {
env,
character,
function
};
struct enviroment { struct enviroment {
std::string name=""; std::string name="";
std::unordered_map<std::string, value*> values; std::unordered_map<std::string, value*> values;
env_type type = env_type::env;
bool has(std::string index); bool has(std::string index);
void set(std::string index, value* val); void set(std::string index, value* val);
value* get(std::string index); value* get(std::string index);

View File

@ -13,16 +13,33 @@ using extendedDefine
"why" "why"
Bob: { Bob: {
speed 50 speed 50
excited: "Hello `Ryan:fname`! " excited: "Hello Mr. `Ryan:lname`, "
wait 200 "how are you doing?"
"How are you doing? I hear you have $`Ryan:money` in your account, nice!"
} }
//Ryan:setNickname(Bob,"Bobby") // Not yet implemeted!
Ryan: { Ryan: {
"Hey Bob I'm good how are you?" "Hey `Bob`, I'm good how are you?"
} } // Should display Hey Bobby, I'm good how are you?
Bob: "I am great thanks!" "Waiting ..."
exit 1
Bob: {
"I am great thanks! I want to show you that I can count!\n"
wait 1
"1\n"
wait 1
"2\n"
wait 1
"3\n"
wait 1
"4\n"
wait 1
"5\n"
}
choice "What do you want to do?" { choice "What do you want to do?" {
"option 1" test2("testing",{1,2,3}) "option 1" test2("testing",{1,2,3})
@ -43,7 +60,7 @@ using extendedDefine
[Bob:char] [Bob:char]
fname = "Bob" fname = "Bob"
//known = true // defaults to false //known = true // defaults to false
lname = "" //lname = "Johnson" // defaults to ""
unknown = "Some Rando" unknown = "Some Rando"
age = .24 age = .24
money = 100 money = 100

View File

@ -120,7 +120,8 @@ namespace dms::tokens {
"pound", "pound",
"dollar", "dollar",
"ampersand", "ampersand",
"nil" "nil",
"pipe"
}; };
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;

View File

@ -41,16 +41,7 @@ namespace dms {
if (v->type == datatypes::block) { if (v->type == datatypes::block) {
if (state->getCharacter(v->s->getValue())!=nullptr) { if (state->getCharacter(v->s->getValue())!=nullptr) {
character* cha = state->getCharacter(v->s->getValue()); character* cha = state->getCharacter(v->s->getValue());
if (index == "fname") { if (cha->values.count(index)) {
temp << cha->fname;
}
else if (index == "lname") {
temp << cha->lname;
}
else if (index == "nickname") {
temp << cha->nickname;
}
else if (cha->values.count(index)) {
temp << cha->values[index]->getPrintable(); temp << cha->values[index]->getPrintable();
} }
else { else {
@ -285,7 +276,7 @@ namespace dms {
} }
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((int)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

View File

@ -10,7 +10,7 @@ namespace dms {
struct value; struct value;
struct dms_args; struct dms_args;
extern const std::string datatype[]; extern const std::string datatype[];
enum datatypes { nil, number, boolean, env, string, custom, variable, block }; enum datatypes { escape, nil, number, boolean, env, string, custom, variable, block };
struct dms_number { struct dms_number {
double val; double val;
double getValue() { return val; } double getValue() { return val; }