Found bugs, implemented while loops
This commit is contained in:
parent
60b8198842
commit
0aea0e0335
@ -27,6 +27,7 @@ namespace dms {
|
|||||||
void init(std::vector<tokens::token>* ptr);
|
void init(std::vector<tokens::token>* ptr);
|
||||||
tokens::token next();
|
tokens::token next();
|
||||||
void prev();
|
void prev();
|
||||||
|
void chomp(tokens::tokentype t);
|
||||||
std::vector<tokens::token> next(tokens::tokentype to, tokens::tokentype tc);
|
std::vector<tokens::token> next(tokens::tokentype to, tokens::tokentype tc);
|
||||||
std::vector<tokens::token> next(tokens::tokentype to, tokens::tokentype tc, bool nonewline);
|
std::vector<tokens::token> next(tokens::tokentype to, tokens::tokentype tc, bool nonewline);
|
||||||
tokens::token peek();
|
tokens::token peek();
|
||||||
@ -86,6 +87,7 @@ namespace dms {
|
|||||||
bool match_process_condition(tokenstream* stream, value& v);
|
bool match_process_condition(tokenstream* stream, value& v);
|
||||||
bool match_process_andor(tokenstream* stream,value& v);
|
bool match_process_andor(tokenstream* stream,value& v);
|
||||||
bool match_process_scope(tokenstream* stream);
|
bool match_process_scope(tokenstream* stream);
|
||||||
|
bool match_process_while(tokenstream* stream);
|
||||||
|
|
||||||
// Build
|
// Build
|
||||||
void buildGoto(std::string g, bool v = false);
|
void buildGoto(std::string g, bool v = false);
|
||||||
|
|||||||
@ -4,6 +4,7 @@ using namespace dms::utils;
|
|||||||
// TODO: process if elseif else statements, for loops and while loops
|
// TODO: process if elseif else statements, for loops and while loops
|
||||||
namespace dms {
|
namespace dms {
|
||||||
bool LineParser::match_process_standard(tokenstream* stream, value& v) {
|
bool LineParser::match_process_standard(tokenstream* stream, value& v) {
|
||||||
|
stream->chomp(newline);
|
||||||
//utils::debug(stream->peek());
|
//utils::debug(stream->peek());
|
||||||
if (stream->peek().type == tokens::none) {
|
if (stream->peek().type == tokens::none) {
|
||||||
return false;
|
return false;
|
||||||
@ -699,7 +700,7 @@ namespace dms {
|
|||||||
token end = t.back();
|
token end = t.back();
|
||||||
t.pop_back();
|
t.pop_back();
|
||||||
t.push_back(token{ tokens::seperator,codes::NOOP,"",t[0].line_num });
|
t.push_back(token{ tokens::seperator,codes::NOOP,"",t[0].line_num });
|
||||||
t.push_back(token{ tokens::nil,codes::NOOP,"",t[0].line_num });
|
t.push_back(token{ tokens::escape,codes::NOOP,"",t[0].line_num });
|
||||||
t.push_back(end);
|
t.push_back(end);
|
||||||
tempstream.init(&t); // Turn tokens we consumed into a tokenstream
|
tempstream.init(&t); // Turn tokens we consumed into a tokenstream
|
||||||
if (tokn.type==tokens::gotoo) {
|
if (tokn.type==tokens::gotoo) {
|
||||||
@ -739,11 +740,16 @@ namespace dms {
|
|||||||
// This part we add values to the opcodes for the bytecode FUNC val a1 a2 a3 ... an
|
// This part we add values to the opcodes for the bytecode FUNC val a1 a2 a3 ... an
|
||||||
while (tempstream.peek().type != tokens::none) { // End of stream
|
while (tempstream.peek().type != tokens::none) { // End of stream
|
||||||
debugInvoker(stream);
|
debugInvoker(stream);
|
||||||
|
//utils::debug(stream->peek());
|
||||||
tempval = value(datatypes::variable);
|
tempval = value(datatypes::variable);
|
||||||
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 (tempstream.match(tokens::escape)) {
|
||||||
|
c->args.push(value(datatypes::escape));
|
||||||
|
tempstream.next();
|
||||||
|
}
|
||||||
else if (match_process_standard(&tempstream, tempval)) {
|
else if (match_process_standard(&tempstream, tempval)) {
|
||||||
c->args.push(tempval);
|
c->args.push(tempval);
|
||||||
}
|
}
|
||||||
@ -756,8 +762,9 @@ namespace dms {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
utils::debug(tempstream.peek());
|
//utils::debug(tempstream.peek());
|
||||||
badSymbol(&tempstream);
|
badSymbol(&tempstream);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -922,6 +929,7 @@ namespace dms {
|
|||||||
if (stream->match(cbracketo)) {
|
if (stream->match(cbracketo)) {
|
||||||
size_t last_line = stream->last().line_num;
|
size_t last_line = stream->last().line_num;
|
||||||
std::vector<token> t = stream->next(cbracketo, cbracketc); // Consume and get tokens
|
std::vector<token> t = stream->next(cbracketo, cbracketc); // Consume and get tokens
|
||||||
|
t.pop_back();
|
||||||
tokenstream tempstream(&t);
|
tokenstream tempstream(&t);
|
||||||
if (notBalanced(t, last_line, stream, "{", "}"))
|
if (notBalanced(t, last_line, stream, "{", "}"))
|
||||||
return false;
|
return false;
|
||||||
@ -931,6 +939,37 @@ namespace dms {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
bool LineParser::match_process_while(tokenstream* stream)
|
||||||
|
{
|
||||||
|
if (stream->match(tokens::name) && stream->peek().name == "while") {
|
||||||
|
stream->next();
|
||||||
|
stream->chomp(tokens::newline);
|
||||||
|
value ref(datatypes::variable);
|
||||||
|
std::string wstart = std::string("WHS_") + random_string(4);
|
||||||
|
std::string wend = std::string("WHE_") + random_string(4);
|
||||||
|
buildLabel(wstart);
|
||||||
|
if (stream->match(parao) && match_process_standard(stream,ref)) {
|
||||||
|
cmd* c = new cmd;
|
||||||
|
c->opcode = codes::IFFF;
|
||||||
|
c->args.push(ref);
|
||||||
|
c->args.push(value(wend));
|
||||||
|
current_chunk->addCmd(c);
|
||||||
|
if (match_process_scope(stream)) {
|
||||||
|
buildGoto(wstart);
|
||||||
|
buildLabel(wend);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
badSymbol(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
badSymbol(stream);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
bool LineParser::match_process_IFFF(tokenstream* stream) {
|
bool LineParser::match_process_IFFF(tokenstream* stream) {
|
||||||
/*if(this) {
|
/*if(this) {
|
||||||
* then()
|
* then()
|
||||||
@ -954,6 +993,7 @@ namespace dms {
|
|||||||
tokenstream tmpstream(&ts);
|
tokenstream tmpstream(&ts);
|
||||||
value cmp(datatypes::variable);
|
value cmp(datatypes::variable);
|
||||||
value nil;
|
value nil;
|
||||||
|
stream->chomp(newline);
|
||||||
if (match_process_standard(&tmpstream,cmp)) {
|
if (match_process_standard(&tmpstream,cmp)) {
|
||||||
std::string ifend = std::string("IFE_") + random_string(4);
|
std::string ifend = std::string("IFE_") + random_string(4);
|
||||||
std::string next = std::string("IFF_") + random_string(4);
|
std::string next = std::string("IFF_") + random_string(4);
|
||||||
@ -984,8 +1024,10 @@ namespace dms {
|
|||||||
c->args.push(value(next));
|
c->args.push(value(next));
|
||||||
current_chunk->addCmd(c);
|
current_chunk->addCmd(c);
|
||||||
if (match_process_function(stream, nil)) {
|
if (match_process_function(stream, nil)) {
|
||||||
|
stream->chomp(newline);
|
||||||
if (stream->match(tokens::pipe)) {
|
if (stream->match(tokens::pipe)) {
|
||||||
stream->next();
|
stream->next();
|
||||||
|
stream->chomp(newline);
|
||||||
buildGoto(ifend);
|
buildGoto(ifend);
|
||||||
buildLabel(next);
|
buildLabel(next);
|
||||||
if (!match_process_function(stream, nil) && !match_process_scope(stream)) {
|
if (!match_process_function(stream, nil) && !match_process_scope(stream)) {
|
||||||
@ -1092,7 +1134,7 @@ namespace dms {
|
|||||||
stream->store(current_chunk);
|
stream->store(current_chunk);
|
||||||
cmd* lastcmd = nullptr;
|
cmd* lastcmd = nullptr;
|
||||||
// It has to start with one of these 3 to even be considered an expression
|
// It has to start with one of these 3 to even be considered an expression
|
||||||
if ((stream->match(tokens::number) || stream->match(tokens::name) || stream->match(tokens::parao)) && stream->tokens.size()>=3) {
|
if ((stream->match(tokens::number) || stream->match(tokens::string) || stream->match(tokens::name) || stream->match(tokens::parao)) && stream->tokens.size()>=3) {
|
||||||
// What do we know, math expressions can only be on a single line. We know where to stop looking if we have to
|
// What do we know, math expressions can only be on a single line. We know where to stop looking if we have to
|
||||||
cmd* c = new cmd;
|
cmd* c = new cmd;
|
||||||
value wv;
|
value wv;
|
||||||
|
|||||||
@ -352,7 +352,8 @@ namespace dms {
|
|||||||
debugInvoker(stream);
|
debugInvoker(stream);
|
||||||
//utils::debug(current);
|
//utils::debug(current);
|
||||||
//utils::print("[flags]");
|
//utils::print("[flags]");
|
||||||
if (current.type == tokens::flag) {
|
if (stream->match(flag)) {
|
||||||
|
current = stream->next();
|
||||||
temp = stream->next(tokens::newline);
|
temp = stream->next(tokens::newline);
|
||||||
stream->prev(); // Unconsume the newline piece
|
stream->prev(); // Unconsume the newline piece
|
||||||
if (temp.size() != 2) {
|
if (temp.size() != 2) {
|
||||||
@ -437,6 +438,7 @@ namespace dms {
|
|||||||
else if (temp == "menu") {
|
else if (temp == "menu") {
|
||||||
createBlock(name, bt_menu);
|
createBlock(name, bt_menu);
|
||||||
}
|
}
|
||||||
|
stream->next();
|
||||||
}
|
}
|
||||||
// Function block type
|
// Function block type
|
||||||
else if (stream->match(tokens::newline, tokens::bracketo, tokens::name, tokens::colon, tokens::name, tokens::parao)) {
|
else if (stream->match(tokens::newline, tokens::bracketo, tokens::name, tokens::colon, tokens::name, tokens::parao)) {
|
||||||
@ -474,6 +476,7 @@ namespace dms {
|
|||||||
// 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
|
||||||
current_chunk->params = args;
|
current_chunk->params = args;
|
||||||
// Thats should be all we need to do
|
// Thats should be all we need to do
|
||||||
|
stream->next();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
str << "'function' keyword expected got " << b;
|
str << "'function' keyword expected got " << b;
|
||||||
@ -483,6 +486,7 @@ namespace dms {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Control Handle all controls here
|
// Control Handle all controls here
|
||||||
|
match_process_while(stream);
|
||||||
match_process_IFFF(stream);
|
match_process_IFFF(stream);
|
||||||
// Let's handle function stuff!
|
// Let's handle function stuff!
|
||||||
//utils::print("[return]");
|
//utils::print("[return]");
|
||||||
@ -508,7 +512,9 @@ namespace dms {
|
|||||||
match_process_wait(stream);
|
match_process_wait(stream);
|
||||||
//utils::print("[jump]");
|
//utils::print("[jump]");
|
||||||
match_process_jump(stream);
|
match_process_jump(stream);
|
||||||
|
if(stream->match(newline) || stream->match(eof))
|
||||||
current = stream->next();
|
current = stream->next();
|
||||||
|
//utils::debug(stream->peek());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void LineParser::_Parse(tokenstream* stream) {
|
void LineParser::_Parse(tokenstream* stream) {
|
||||||
|
|||||||
@ -17,6 +17,11 @@ namespace dms {
|
|||||||
void tokenstream::prev() {
|
void tokenstream::prev() {
|
||||||
pos--;
|
pos--;
|
||||||
}
|
}
|
||||||
|
void tokenstream::chomp(tokens::tokentype t)
|
||||||
|
{
|
||||||
|
while (peek().type == t)
|
||||||
|
next();
|
||||||
|
}
|
||||||
void tokenstream::store(chunk* c) {
|
void tokenstream::store(chunk* c) {
|
||||||
stack.push(c->cmds.size());
|
stack.push(c->cmds.size());
|
||||||
spos.push(pos);
|
spos.push(pos);
|
||||||
@ -297,6 +302,11 @@ namespace dms {
|
|||||||
chunk_type = bk_type;
|
chunk_type = bk_type;
|
||||||
current_chunk->type = bk_type;
|
current_chunk->type = bk_type;
|
||||||
|
|
||||||
|
cmd* bn = new cmd;
|
||||||
|
bn->opcode = codes::BLCK;
|
||||||
|
bn->args.push(value(bk_name));
|
||||||
|
bn->args.push(value(bk_type));
|
||||||
|
current_chunk->addCmd(bn);
|
||||||
if (state->isEnabled("debugging")) {
|
if (state->isEnabled("debugging")) {
|
||||||
cmd* c = new cmd;
|
cmd* c = new cmd;
|
||||||
c->opcode = codes::FILE;
|
c->opcode = codes::FILE;
|
||||||
|
|||||||
@ -26,7 +26,7 @@ namespace dms {
|
|||||||
void addLabel(std::string name);
|
void addLabel(std::string name);
|
||||||
friend std::ostream& operator << (std::ostream& out, const chunk& c) {
|
friend std::ostream& operator << (std::ostream& out, const chunk& c) {
|
||||||
for (size_t i = 0; i < c.cmds.size(); i++) {
|
for (size_t i = 0; i < c.cmds.size(); i++) {
|
||||||
out << *(c.cmds[i]) << std::endl;
|
out << *(c.cmds[i]) << std::endl;// (char)255 << (char)254;
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@ const std::string dms::codes::list[] = {
|
|||||||
"ASGN",
|
"ASGN",
|
||||||
"LABL",
|
"LABL",
|
||||||
"CHOI",
|
"CHOI",
|
||||||
"OPTN",
|
"BLCK",
|
||||||
"FORE",
|
"FORE",
|
||||||
"WHLE",
|
"WHLE",
|
||||||
"FUNC",
|
"FUNC",
|
||||||
|
|||||||
@ -10,12 +10,12 @@ namespace dms::codes {
|
|||||||
LOAD, // Done
|
LOAD, // Done
|
||||||
VERN, // Done
|
VERN, // Done
|
||||||
USIN, // TODO
|
USIN, // TODO
|
||||||
STAT, // Done
|
STAT,
|
||||||
DISP, // Done
|
DISP, // Done
|
||||||
ASGN, // Done
|
ASGN, // Done
|
||||||
LABL, // Done
|
LABL, // Done
|
||||||
CHOI, // Done
|
CHOI, // Done
|
||||||
OPTN,
|
BLCK,
|
||||||
FORE,
|
FORE,
|
||||||
WHLE,
|
WHLE,
|
||||||
FUNC, // Done
|
FUNC, // Done
|
||||||
|
|||||||
@ -73,7 +73,12 @@ namespace dms {
|
|||||||
enable("statesave");
|
enable("statesave");
|
||||||
chunk* c = new chunk;
|
chunk* c = new chunk;
|
||||||
c->name = "$END";
|
c->name = "$END";
|
||||||
c->type = blocktype::bt_block;
|
c->type = bt_block;
|
||||||
|
cmd* bn = new cmd;
|
||||||
|
bn->opcode = codes::BLCK;
|
||||||
|
bn->args.push(value("$END"));
|
||||||
|
bn->args.push(value(bt_block));
|
||||||
|
c->addCmd(bn);
|
||||||
cmd* cc = new cmd;
|
cmd* cc = new cmd;
|
||||||
cc->opcode = codes::EXIT;
|
cc->opcode = codes::EXIT;
|
||||||
cc->args.push(value(0));
|
cc->args.push(value(0));
|
||||||
@ -113,19 +118,6 @@ namespace dms {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void dms_state::dump(errors::error err) {
|
|
||||||
std::cout << std::endl << "STATE DUMP" << std::endl << "Number of chunks: " << chunks.size();
|
|
||||||
std::ofstream outputFile("dump.bin");
|
|
||||||
for (const auto& [key, val] : chunks) {
|
|
||||||
std::cout << "Key: " << key << "<" << getBlockType(val->type) << ">" << std::endl << *val << std::endl;
|
|
||||||
outputFile << "Key: " << key << "<" << getBlockType(val->type) << ">" << std::endl << *val << std::endl;
|
|
||||||
}
|
|
||||||
//If the error has a chunk then we get the data from it
|
|
||||||
if (err.current_chunk != nullptr) {
|
|
||||||
outputFile << err.current_chunk->name << ":" << std::endl << *err.current_chunk << std::endl;
|
|
||||||
}
|
|
||||||
outputFile.close();
|
|
||||||
}
|
|
||||||
bool dms_state::hasError() {
|
bool dms_state::hasError() {
|
||||||
return stop;
|
return stop;
|
||||||
}
|
}
|
||||||
@ -138,14 +130,10 @@ namespace dms {
|
|||||||
(*getMem())[var.getPrintable()] = val;
|
(*getMem())[var.getPrintable()] = val;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void dms_state::dump(bool print) {
|
void dms_state::dump(std::string fn) {
|
||||||
if (print)
|
std::ofstream outputFile(fn);
|
||||||
std::cout << "Number of chunks: " << chunks.size() << std::endl;
|
|
||||||
std::ofstream outputFile("dump.bin");
|
|
||||||
for (const auto& [key, val] : chunks) {
|
for (const auto& [key, val] : chunks) {
|
||||||
if(print)
|
outputFile << *val << std::endl;
|
||||||
std::cout << "Key: " << key << "<" << getBlockType(val->type) << ">" << std::endl << *val << std::endl;
|
|
||||||
outputFile << "Key: " << key << "<" << getBlockType(val->type) << ">" << std::endl << *val << std::endl;
|
|
||||||
}
|
}
|
||||||
outputFile.close();
|
outputFile.close();
|
||||||
}
|
}
|
||||||
@ -157,7 +145,7 @@ namespace dms {
|
|||||||
std::cout << err.err_msg << " On Line <" << err.linenum << ">" << std::endl;
|
std::cout << err.err_msg << " On Line <" << err.linenum << ">" << std::endl;
|
||||||
}
|
}
|
||||||
else if (isEnabled("debugging")) {
|
else if (isEnabled("debugging")) {
|
||||||
std::cout << err.err_msg << " In File " << cur_file << " On Line <" << cur_line << ">" << std::endl;
|
std::cout << err.err_msg << " In file: '" << cur_file << "' on Line <" << cur_line << ">" << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << err.err_msg << std::endl;
|
std::cout << err.err_msg << std::endl;
|
||||||
|
|||||||
@ -40,8 +40,7 @@ namespace dms {
|
|||||||
errors::error err;
|
errors::error err;
|
||||||
|
|
||||||
dms_state();
|
dms_state();
|
||||||
void dump(errors::error err);
|
void dump(std::string fn = "dump.bin");
|
||||||
void dump(bool print=false);
|
|
||||||
void push_error(errors::error err);
|
void push_error(errors::error err);
|
||||||
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);
|
||||||
|
|||||||
@ -438,18 +438,22 @@ namespace dms {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case comp::gt: {
|
case comp::gt: {
|
||||||
|
if (left.isNil() || right.isNil()) {push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" });return false;}
|
||||||
assign(assn, value(left > right));
|
assign(assn, value(left > right));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case comp::gteq: {
|
case comp::gteq: {
|
||||||
|
if (left.isNil() || right.isNil()) { push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" }); return false; }
|
||||||
assign(assn, value(left >= right));
|
assign(assn, value(left >= right));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case comp::lt: {
|
case comp::lt: {
|
||||||
|
if (left.isNil() || right.isNil()) { push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" }); return false; }
|
||||||
assign(assn, value(left < right));
|
assign(assn, value(left < right));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case comp::lteq: {
|
case comp::lteq: {
|
||||||
|
if (left.isNil() || right.isNil()) { push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" }); return false; }
|
||||||
assign(assn, value(left <= right));
|
assign(assn, value(left <= right));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
DMS/dump.bin
BIN
DMS/dump.bin
Binary file not shown.
252
DMS/dump.txt
252
DMS/dump.txt
@ -21,9 +21,6 @@ Line <6> name savestate
|
|||||||
Line <6> newline
|
Line <6> newline
|
||||||
Line <6> newline
|
Line <6> newline
|
||||||
Line <7> newline
|
Line <7> newline
|
||||||
Line <8> flag
|
|
||||||
Line <8> name debugging
|
|
||||||
Line <8> newline
|
|
||||||
Line <8> newline
|
Line <8> newline
|
||||||
Line <9> flag
|
Line <9> flag
|
||||||
Line <9> string loadtest.dms
|
Line <9> string loadtest.dms
|
||||||
@ -54,12 +51,11 @@ Line <14> newline
|
|||||||
Line <14> newline
|
Line <14> newline
|
||||||
Line <15> name print
|
Line <15> name print
|
||||||
Line <15> parao (
|
Line <15> parao (
|
||||||
Line <15> parao (
|
Line <15> string this
|
||||||
Line <15> name a1
|
Line <15> plus +
|
||||||
Line <15> not !
|
Line <15> string or
|
||||||
Line <15> equal =
|
Line <15> plus +
|
||||||
Line <15> name b1
|
Line <15> string that
|
||||||
Line <15> parac )
|
|
||||||
Line <15> parac )
|
Line <15> parac )
|
||||||
Line <15> newline
|
Line <15> newline
|
||||||
Line <15> newline
|
Line <15> newline
|
||||||
@ -158,173 +154,207 @@ Line <30> newline
|
|||||||
Line <30> newline
|
Line <30> newline
|
||||||
Line <31> newline
|
Line <31> newline
|
||||||
Line <31> newline
|
Line <31> newline
|
||||||
|
Line <32> name count
|
||||||
|
Line <32> equal =
|
||||||
|
Line <32> number 0
|
||||||
Line <32> newline
|
Line <32> newline
|
||||||
Line <32> newline
|
Line <32> newline
|
||||||
Line <33> name print
|
Line <33> name while
|
||||||
Line <33> parao (
|
Line <33> parao (
|
||||||
Line <33> string This is coming along nicely!
|
Line <33> name count
|
||||||
|
Line <33> anglebracketO <
|
||||||
|
Line <33> number 10
|
||||||
Line <33> parac )
|
Line <33> parac )
|
||||||
|
Line <33> cbracketo {
|
||||||
Line <33> newline
|
Line <33> newline
|
||||||
Line <33> newline
|
Line <33> newline
|
||||||
|
Line <34> name print
|
||||||
|
Line <34> parao (
|
||||||
|
Line <34> string Count:
|
||||||
|
Line <34> plus +
|
||||||
|
Line <34> name count
|
||||||
|
Line <34> parac )
|
||||||
Line <34> newline
|
Line <34> newline
|
||||||
Line <34> newline
|
Line <34> newline
|
||||||
Line <35> name print
|
Line <35> name count
|
||||||
Line <35> parao (
|
Line <35> equal =
|
||||||
Line <35> string concat test
|
Line <35> name count
|
||||||
Line <35> parac )
|
Line <35> plus +
|
||||||
|
Line <35> number 1
|
||||||
Line <35> newline
|
Line <35> newline
|
||||||
Line <35> newline
|
Line <35> newline
|
||||||
Line <36> name test1
|
Line <36> cbracketc }
|
||||||
Line <36> equal =
|
|
||||||
Line <36> string Hello
|
|
||||||
Line <36> newline
|
Line <36> newline
|
||||||
Line <36> newline
|
Line <36> newline
|
||||||
Line <37> name print
|
|
||||||
Line <37> parao (
|
|
||||||
Line <37> number 2.2
|
|
||||||
Line <37> plus +
|
|
||||||
Line <37> name test1
|
|
||||||
Line <37> plus +
|
|
||||||
Line <37> string World!
|
|
||||||
Line <37> plus +
|
|
||||||
Line <37> name fake
|
|
||||||
Line <37> parac )
|
|
||||||
Line <37> newline
|
Line <37> newline
|
||||||
Line <37> newline
|
Line <37> newline
|
||||||
Line <38> newline
|
Line <38> newline
|
||||||
|
Line <38> newline
|
||||||
|
Line <39> name print
|
||||||
|
Line <39> parao (
|
||||||
|
Line <39> string This is coming along nicely!
|
||||||
|
Line <39> parac )
|
||||||
|
Line <39> newline
|
||||||
Line <39> newline
|
Line <39> newline
|
||||||
Line <40> newline
|
Line <40> newline
|
||||||
|
Line <40> newline
|
||||||
|
Line <41> name print
|
||||||
|
Line <41> parao (
|
||||||
|
Line <41> string concat test
|
||||||
|
Line <41> parac )
|
||||||
Line <41> newline
|
Line <41> newline
|
||||||
Line <41> newline
|
Line <41> newline
|
||||||
Line <42> name if
|
Line <42> name test1
|
||||||
Line <42> parao (
|
|
||||||
Line <42> name this
|
|
||||||
Line <42> equal =
|
Line <42> equal =
|
||||||
Line <42> equal =
|
Line <42> string Hello
|
||||||
Line <42> name that
|
|
||||||
Line <42> parac )
|
|
||||||
Line <42> name this
|
|
||||||
Line <42> parao (
|
|
||||||
Line <42> parac )
|
|
||||||
Line <42> pipe |
|
|
||||||
Line <42> name that
|
|
||||||
Line <42> parao (
|
|
||||||
Line <42> parac )
|
|
||||||
Line <42> newline
|
Line <42> newline
|
||||||
Line <42> newline
|
Line <42> newline
|
||||||
|
Line <43> name print
|
||||||
|
Line <43> parao (
|
||||||
|
Line <43> number 2.2
|
||||||
|
Line <43> plus +
|
||||||
|
Line <43> name test1
|
||||||
|
Line <43> plus +
|
||||||
|
Line <43> string World!
|
||||||
|
Line <43> plus +
|
||||||
|
Line <43> name fake
|
||||||
|
Line <43> parac )
|
||||||
Line <43> newline
|
Line <43> newline
|
||||||
Line <43> newline
|
Line <43> newline
|
||||||
Line <44> bracketo [
|
|
||||||
Line <44> name this
|
|
||||||
Line <44> colon :
|
|
||||||
Line <44> name function
|
|
||||||
Line <44> parao (
|
|
||||||
Line <44> parac )
|
|
||||||
Line <44> bracketc ]
|
|
||||||
Line <44> newline
|
Line <44> newline
|
||||||
Line <44> newline
|
|
||||||
Line <45> name print
|
|
||||||
Line <45> parao (
|
|
||||||
Line <45> string This
|
|
||||||
Line <45> parac )
|
|
||||||
Line <45> newline
|
|
||||||
Line <45> newline
|
Line <45> newline
|
||||||
Line <46> newline
|
Line <46> newline
|
||||||
Line <46> newline
|
Line <47> name if
|
||||||
Line <47> bracketo [
|
Line <47> parao (
|
||||||
Line <47> name that
|
Line <47> name a
|
||||||
Line <47> colon :
|
Line <47> equal =
|
||||||
Line <47> name function
|
Line <47> equal =
|
||||||
|
Line <47> nil nil
|
||||||
|
Line <47> parac )
|
||||||
|
Line <47> name this
|
||||||
|
Line <47> parao (
|
||||||
|
Line <47> parac )
|
||||||
|
Line <47> pipe |
|
||||||
|
Line <47> name that
|
||||||
Line <47> parao (
|
Line <47> parao (
|
||||||
Line <47> parac )
|
Line <47> parac )
|
||||||
Line <47> bracketc ]
|
|
||||||
Line <47> newline
|
Line <47> newline
|
||||||
Line <47> newline
|
Line <47> newline
|
||||||
Line <48> name print
|
|
||||||
Line <48> parao (
|
|
||||||
Line <48> string That
|
|
||||||
Line <48> parac )
|
|
||||||
Line <48> newline
|
Line <48> newline
|
||||||
Line <48> newline
|
Line <48> newline
|
||||||
Line <49> newline
|
Line <49> newline
|
||||||
Line <49> newline
|
Line <49> newline
|
||||||
Line <50> bracketo [
|
Line <50> bracketo [
|
||||||
Line <50> name Bob
|
Line <50> name this
|
||||||
Line <50> colon :
|
Line <50> colon :
|
||||||
Line <50> name char
|
Line <50> name function
|
||||||
|
Line <50> parao (
|
||||||
|
Line <50> parac )
|
||||||
Line <50> bracketc ]
|
Line <50> bracketc ]
|
||||||
Line <50> newline
|
Line <50> newline
|
||||||
Line <50> newline
|
Line <50> newline
|
||||||
|
Line <51> name print
|
||||||
|
Line <51> parao (
|
||||||
|
Line <51> string This
|
||||||
|
Line <51> parac )
|
||||||
|
Line <51> newline
|
||||||
Line <51> newline
|
Line <51> newline
|
||||||
Line <52> newline
|
Line <52> newline
|
||||||
|
Line <52> newline
|
||||||
|
Line <53> bracketo [
|
||||||
|
Line <53> name that
|
||||||
|
Line <53> colon :
|
||||||
|
Line <53> name function
|
||||||
|
Line <53> parao (
|
||||||
|
Line <53> parac )
|
||||||
|
Line <53> bracketc ]
|
||||||
Line <53> newline
|
Line <53> newline
|
||||||
Line <54> name unknown
|
Line <53> newline
|
||||||
Line <54> equal =
|
Line <54> name print
|
||||||
Line <54> string Some Random Guy
|
Line <54> parao (
|
||||||
|
Line <54> string That
|
||||||
|
Line <54> parac )
|
||||||
Line <54> newline
|
Line <54> newline
|
||||||
Line <54> newline
|
Line <54> newline
|
||||||
Line <55> name age
|
|
||||||
Line <55> equal =
|
|
||||||
Line <55> number .24
|
|
||||||
Line <55> newline
|
Line <55> newline
|
||||||
Line <55> newline
|
Line <55> newline
|
||||||
Line <56> name money
|
Line <56> bracketo [
|
||||||
Line <56> equal =
|
Line <56> name Bob
|
||||||
Line <56> number 100
|
Line <56> colon :
|
||||||
|
Line <56> name char
|
||||||
|
Line <56> bracketc ]
|
||||||
Line <56> newline
|
Line <56> newline
|
||||||
Line <56> newline
|
Line <56> newline
|
||||||
Line <57> name excited
|
|
||||||
Line <57> colon :
|
|
||||||
Line <57> string path/to/file
|
|
||||||
Line <57> newline
|
|
||||||
Line <57> newline
|
Line <57> newline
|
||||||
Line <58> newline
|
Line <58> newline
|
||||||
Line <58> newline
|
|
||||||
Line <59> bracketo [
|
|
||||||
Line <59> name test1
|
|
||||||
Line <59> colon :
|
|
||||||
Line <59> name function
|
|
||||||
Line <59> parao (
|
|
||||||
Line <59> parac )
|
|
||||||
Line <59> bracketc ]
|
|
||||||
Line <59> newline
|
Line <59> newline
|
||||||
Line <59> newline
|
Line <60> name unknown
|
||||||
Line <60> string Inside a function!
|
Line <60> equal =
|
||||||
|
Line <60> string Some Random Guy
|
||||||
Line <60> newline
|
Line <60> newline
|
||||||
Line <60> newline
|
Line <60> newline
|
||||||
|
Line <61> name age
|
||||||
|
Line <61> equal =
|
||||||
|
Line <61> number .24
|
||||||
Line <61> newline
|
Line <61> newline
|
||||||
|
Line <61> newline
|
||||||
|
Line <62> name money
|
||||||
|
Line <62> equal =
|
||||||
|
Line <62> number 100
|
||||||
Line <62> newline
|
Line <62> newline
|
||||||
|
Line <62> newline
|
||||||
|
Line <63> name excited
|
||||||
|
Line <63> colon :
|
||||||
|
Line <63> string path/to/file
|
||||||
Line <63> newline
|
Line <63> newline
|
||||||
Line <63> newline
|
Line <63> newline
|
||||||
Line <64> bracketo [
|
|
||||||
Line <64> name newblock
|
|
||||||
Line <64> colon :
|
|
||||||
Line <64> name function
|
|
||||||
Line <64> parao (
|
|
||||||
Line <64> name a
|
|
||||||
Line <64> seperator ,
|
|
||||||
Line <64> name b
|
|
||||||
Line <64> seperator ,
|
|
||||||
Line <64> name c
|
|
||||||
Line <64> parac )
|
|
||||||
Line <64> bracketc ]
|
|
||||||
Line <64> newline
|
Line <64> newline
|
||||||
Line <64> newline
|
Line <64> newline
|
||||||
Line <65> string Func Arguments: a = `a`, b = `b`, c = `c`
|
Line <65> bracketo [
|
||||||
|
Line <65> name test1
|
||||||
|
Line <65> colon :
|
||||||
|
Line <65> name function
|
||||||
|
Line <65> parao (
|
||||||
|
Line <65> parac )
|
||||||
|
Line <65> bracketc ]
|
||||||
Line <65> newline
|
Line <65> newline
|
||||||
Line <65> newline
|
Line <65> newline
|
||||||
Line <66> string Time to return
|
Line <66> string Inside a function!
|
||||||
Line <66> newline
|
Line <66> newline
|
||||||
Line <66> newline
|
Line <66> newline
|
||||||
Line <67> ret
|
|
||||||
Line <67> name a
|
|
||||||
Line <67> plus +
|
|
||||||
Line <67> name b
|
|
||||||
Line <67> plus +
|
|
||||||
Line <67> name c
|
|
||||||
Line <67> newline
|
Line <67> newline
|
||||||
Line <67> newline
|
Line <68> newline
|
||||||
Line <67> eof
|
Line <69> newline
|
||||||
|
Line <69> newline
|
||||||
|
Line <70> bracketo [
|
||||||
|
Line <70> name newblock
|
||||||
|
Line <70> colon :
|
||||||
|
Line <70> name function
|
||||||
|
Line <70> parao (
|
||||||
|
Line <70> name a
|
||||||
|
Line <70> seperator ,
|
||||||
|
Line <70> name b
|
||||||
|
Line <70> seperator ,
|
||||||
|
Line <70> name c
|
||||||
|
Line <70> parac )
|
||||||
|
Line <70> bracketc ]
|
||||||
|
Line <70> newline
|
||||||
|
Line <70> newline
|
||||||
|
Line <71> string Func Arguments: a = `a`, b = `b`, c = `c`
|
||||||
|
Line <71> newline
|
||||||
|
Line <71> newline
|
||||||
|
Line <72> string Time to return
|
||||||
|
Line <72> newline
|
||||||
|
Line <72> newline
|
||||||
|
Line <73> ret
|
||||||
|
Line <73> name a
|
||||||
|
Line <73> plus +
|
||||||
|
Line <73> name b
|
||||||
|
Line <73> plus +
|
||||||
|
Line <73> name c
|
||||||
|
Line <73> newline
|
||||||
|
Line <73> newline
|
||||||
|
Line <73> eof
|
||||||
Line <1> newline
|
Line <1> newline
|
||||||
Line <1> newline
|
Line <1> newline
|
||||||
Line <1> bracketo [
|
Line <1> bracketo [
|
||||||
|
|||||||
19
DMS/test.dms
19
DMS/test.dms
@ -5,14 +5,14 @@ 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
|
||||||
enable debugging
|
//enable debugging
|
||||||
loadfile "loadtest.dms"
|
loadfile "loadtest.dms"
|
||||||
version 0.2
|
version 0.2
|
||||||
using extendedDefine
|
using extendedDefine
|
||||||
[main]
|
[main]
|
||||||
a1 = 10
|
a1 = 10
|
||||||
b1 = 15
|
b1 = 15
|
||||||
print((a1!=b1))
|
print("this" + " or " + "that")
|
||||||
|
|
||||||
if(a==b){
|
if(a==b){
|
||||||
print("Doing a test!")
|
print("Doing a test!")
|
||||||
@ -29,17 +29,24 @@ using extendedDefine
|
|||||||
print("Do you work?")
|
print("Do you work?")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
while(count<10){
|
||||||
|
print("Count: " + count)
|
||||||
|
count = count + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// for(x, 10, 1, -1){
|
||||||
|
// print(x)
|
||||||
|
// }
|
||||||
|
|
||||||
print("This is coming along nicely!")
|
print("This is coming along nicely!")
|
||||||
|
|
||||||
print("concat test")
|
print("concat test")
|
||||||
test1 = "Hello "
|
test1 = "Hello "
|
||||||
print(2.2+test1+"World!"+fake)
|
print(2.2+test1+"World!"+fake)
|
||||||
// for(x, 10, 1, -1){
|
|
||||||
// print(x)
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (this==that) this()|that()
|
if(a==nil) this()|that()
|
||||||
|
|
||||||
|
|
||||||
[this:function()]
|
[this:function()]
|
||||||
print("This")
|
print("This")
|
||||||
|
|||||||
@ -52,6 +52,7 @@ namespace dms::tokens {
|
|||||||
pipe,
|
pipe,
|
||||||
anglebracketO,
|
anglebracketO,
|
||||||
anglebracketC,
|
anglebracketC,
|
||||||
|
escape,
|
||||||
};//stream, t_vec, line, isNum, buffer
|
};//stream, t_vec, line, isNum, buffer
|
||||||
struct token {
|
struct token {
|
||||||
tokentype type = noop;
|
tokentype type = noop;
|
||||||
@ -126,6 +127,7 @@ namespace dms::tokens {
|
|||||||
"pipe",
|
"pipe",
|
||||||
"anglebracketO",
|
"anglebracketO",
|
||||||
"anglebracketC",
|
"anglebracketC",
|
||||||
|
"escape"
|
||||||
};
|
};
|
||||||
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;
|
||||||
|
|||||||
@ -176,11 +176,11 @@ namespace dms {
|
|||||||
else if (lhs.type == datatypes::boolean && rhs.type == datatypes::boolean) {
|
else if (lhs.type == datatypes::boolean && rhs.type == datatypes::boolean) {
|
||||||
return value((bool)(lhs.b + rhs.b));
|
return value((bool)(lhs.b + rhs.b));
|
||||||
}
|
}
|
||||||
else if ((lhs.type == datatypes::string && !(rhs.type == nil)) || rhs.type == datatypes::string && !(lhs.type == nil)) {
|
else if ((lhs.type == datatypes::string || rhs.type == datatypes::string)) {
|
||||||
return lhs.getPrintable() + rhs.getPrintable();
|
return lhs.getPrintable() + rhs.getPrintable();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return value("Invalid use of '+'!", datatypes::error);
|
return "Invalid use of '+'";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
value operator-(const value& lhs, const value& rhs) {
|
value operator-(const value& lhs, const value& rhs) {
|
||||||
@ -404,6 +404,9 @@ namespace dms {
|
|||||||
else if (type == datatypes::error) {
|
else if (type == datatypes::error) {
|
||||||
return std::string("ERROR: ") + s;
|
return std::string("ERROR: ") + s;
|
||||||
}
|
}
|
||||||
|
else if (type == datatypes::escape) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
std::string value::toString() const {
|
std::string value::toString() const {
|
||||||
@ -444,6 +447,9 @@ namespace dms {
|
|||||||
else if (c.type == datatypes::variable) {
|
else if (c.type == datatypes::variable) {
|
||||||
out << (char)c.type << c.s; // Do the lookup
|
out << (char)c.type << c.s; // Do the lookup
|
||||||
}
|
}
|
||||||
|
else if (c.type == datatypes::escape) {
|
||||||
|
out << (char)0;
|
||||||
|
}
|
||||||
return out;
|
return out;
|
||||||
};
|
};
|
||||||
// Fixed issue with memory not properly being cleaned up
|
// Fixed issue with memory not properly being cleaned up
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user