fixed goto/jump ()

This commit is contained in:
Ryan Ward 2020-11-13 23:24:01 -05:00
parent e534274d09
commit b602823646
11 changed files with 118 additions and 133 deletions

View File

@ -178,12 +178,10 @@
<ClInclude Include="dms_state.h" /> <ClInclude Include="dms_state.h" />
<ClInclude Include="Invoker.h" /> <ClInclude Include="Invoker.h" />
<ClInclude Include="memory.h" /> <ClInclude Include="memory.h" />
<ClInclude Include="string_utils.h" />
<ClInclude Include="dms_exceptions.h" /> <ClInclude Include="dms_exceptions.h" />
<ClInclude Include="errors.h" /> <ClInclude Include="errors.h" />
<ClInclude Include="dms.h" /> <ClInclude Include="dms.h" />
<ClInclude Include="LineParser.h" /> <ClInclude Include="LineParser.h" />
<ClInclude Include="number_utils.h" />
<ClInclude Include="token.h" /> <ClInclude Include="token.h" />
<ClInclude Include="utils.h" /> <ClInclude Include="utils.h" />
<ClInclude Include="value.h" /> <ClInclude Include="value.h" />

View File

@ -107,18 +107,12 @@
<ClInclude Include="LineParser.h"> <ClInclude Include="LineParser.h">
<Filter>Header Files\DMS</Filter> <Filter>Header Files\DMS</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="number_utils.h">
<Filter>Header Files\DMS</Filter>
</ClInclude>
<ClInclude Include="dms.h"> <ClInclude Include="dms.h">
<Filter>Header Files\DMS</Filter> <Filter>Header Files\DMS</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="errors.h"> <ClInclude Include="errors.h">
<Filter>Header Files\DMS</Filter> <Filter>Header Files\DMS</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="string_utils.h">
<Filter>Header Files\DMS</Filter>
</ClInclude>
<ClInclude Include="dms_state.h"> <ClInclude Include="dms_state.h">
<Filter>Header Files\DMS</Filter> <Filter>Header Files\DMS</Filter>
</ClInclude> </ClInclude>

View File

@ -515,9 +515,13 @@ namespace dms {
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) {
if (tempstream.match(tokens::string) || tempstream.match(tokens::gotoo)) { if (tempstream.match(tokens::string)) {
buildGoto(tempstream.next().name); buildGoto(tempstream.next().name);
buildNoop(); delete c;
return true;
}
else if (tempstream.match(tokens::name)) {
buildGoto(tempstream.next().name,true);
delete c; delete c;
return true; return true;
} }
@ -527,9 +531,13 @@ namespace dms {
} }
} }
else if (tokn.type == tokens::jump) { else if (tokn.type == tokens::jump) {
if (tempstream.match(tokens::string) || tempstream.match(tokens::jump)) { if (tempstream.match(tokens::string)) {
buildJump(tempstream.next().name); buildJump(tempstream.next().name);
buildNoop(); delete c;
return true;
}
else if (tempstream.match(tokens::name)) {
buildJump(tempstream.next().name, true);
delete c; delete c;
return true; return true;
} }

View File

@ -8,8 +8,6 @@
#include "dms_state.h" #include "dms_state.h"
#include "errors.h" #include "errors.h"
#include "LineParser.h" #include "LineParser.h"
#include "number_utils.h"
#include "string_utils.h"
#include "token.h" #include "token.h"
#include "utils.h" #include "utils.h"
#include "value.h" #include "value.h"

View File

@ -61,12 +61,13 @@ namespace dms {
dms_state::dms_state() { dms_state::dms_state() {
// We should define the defaults for the enables // We should define the defaults for the enables
pushMem(); // Main memory pushMem(); // Main memory
enables.insert_or_assign("leaking", false); disable("forwardlabels");
enables.insert_or_assign("debugging", false); disable("leaking");
enables.insert_or_assign("warnings", false); // disable("debugging");
enables.insert_or_assign("statesave", true); // Allows you to save state disable("warnings");
enables.insert_or_assign("omniscient", false); // Allows you to know who's who when you first meet them disable("omniscient");
enables.insert_or_assign("fullname", true); disable("fullname");
enable("statesave");
chunk* c = new chunk; chunk* c = new chunk;
c->name = "$END"; c->name = "$END";
c->type = blocktype::bt_block; c->type = blocktype::bt_block;

View File

@ -179,9 +179,21 @@ namespace dms {
case GOTO: case GOTO:
{ {
value labl = c->args.args[0]; value labl = c->args.args[0];
size_t nnpos = seek(labl.getPrintable(),cmds, LABL, 0); if (isEnabled("forwardlabels")) {
size_t nnpos = seek(labl.resolve(this).getPrintable(), cmds, LABL, pos); // Seek from next pos (pos++) to end of cmds
if (!nnpos) { if (!nnpos) {
push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown choice!") }); // This could be a method, it could, but it isn't. We jump to searching from the beginning of the block
goto seek_from_0;
}
else {
pos = nnpos;
}
break;
}
seek_from_0:
size_t nnpos = seek(labl.resolve(this).getPrintable(),cmds, LABL, 0);
if (!nnpos) {
push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown label '",labl.resolve(this).getPrintable(),"'!") });
return false; return false;
} }
else { else {

Binary file not shown.

View File

@ -10,51 +10,51 @@ 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 forseelabels Line <4> name forwardlabels
Line <4> newline
Line <4> newline Line <4> newline
Line <5> flag Line <5> flag
Line <5> name savestate Line <5> name savestate
Line <5> newline Line <5> newline
Line <5> newline Line <5> newline
Line <6> flag
Line <6> name fullname
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> string loadtest.dms Line <9> number 0.2
Line <9> newline Line <9> newline
Line <9> newline Line <9> newline
Line <10> flag Line <10> flag
Line <10> number 0.2 Line <10> name extendedDefine
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> name main
Line <12> bracketc ]
Line <12> newline Line <12> newline
Line <12> newline Line <12> newline
Line <13> bracketo [ Line <13> name Ryan
Line <13> name main Line <13> colon :
Line <13> bracketc ] Line <13> string Hello `Bob`, how are you doing?
Line <13> newline Line <13> newline
Line <13> newline Line <13> newline
Line <14> name Ryan Line <14> name Bob
Line <14> colon : Line <14> colon :
Line <14> string Hello `Bob`, how are you doing? Line <14> string Hi `Ryan`, I'm good.
Line <14> newline Line <14> newline
Line <14> newline Line <14> newline
Line <15> name Bob Line <15> name a
Line <15> colon : Line <15> equal =
Line <15> string Hi `Ryan`, I'm good. Line <15> number 1000
Line <15> newline Line <15> newline
Line <15> newline Line <15> newline
Line <16> name a Line <16> name imp
Line <16> equal = Line <16> equal =
Line <16> number 1000 Line <16> string this
Line <16> newline Line <16> newline
Line <16> newline Line <16> newline
Line <17> name test Line <17> name test
@ -76,7 +76,7 @@ Line <19> newline
Line <19> newline Line <19> newline
Line <20> string this Line <20> string this
Line <20> gotoo Line <20> gotoo
Line <20> string this Line <20> name imp
Line <20> newline Line <20> newline
Line <20> newline Line <20> newline
Line <21> string that Line <21> string that
@ -127,6 +127,7 @@ Line <31> parac )
Line <31> newline Line <31> newline
Line <31> newline Line <31> newline
Line <32> newline Line <32> newline
Line <32> newline
Line <33> newline Line <33> newline
Line <33> newline Line <33> newline
Line <34> newline Line <34> newline
@ -141,83 +142,86 @@ Line <39> newline
Line <40> newline Line <40> newline
Line <41> newline Line <41> newline
Line <41> newline Line <41> newline
Line <42> bracketo [
Line <42> name Bob
Line <42> colon :
Line <42> name char
Line <42> bracketc ]
Line <42> newline
Line <42> newline Line <42> 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 <46> name unknown
Line <46> equal =
Line <46> string Some Random Guy
Line <46> newline Line <46> newline
Line <46> newline
Line <47> name age
Line <47> equal =
Line <47> number 0.24
Line <47> newline Line <47> newline
Line <47> newline Line <48> name unknown
Line <48> name money
Line <48> equal = Line <48> equal =
Line <48> number 100 Line <48> string Some Random Guy
Line <48> newline Line <48> newline
Line <48> newline Line <48> newline
Line <49> name excited Line <49> name age
Line <49> colon : Line <49> equal =
Line <49> string path/to/file Line <49> number 0.24
Line <49> newline 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 <50> newline
Line <51> bracketo [ Line <51> name excited
Line <51> name test1
Line <51> colon : Line <51> colon :
Line <51> name function Line <51> string path/to/file
Line <51> parao (
Line <51> parac )
Line <51> bracketc ]
Line <51> newline Line <51> newline
Line <51> newline Line <51> newline
Line <52> string Inside a function!
Line <52> newline Line <52> newline
Line <52> newline Line <52> newline
Line <53> bracketo [
Line <53> name test1
Line <53> colon :
Line <53> name function
Line <53> parao (
Line <53> parac )
Line <53> bracketc ]
Line <53> newline Line <53> newline
Line <53> newline
Line <54> string Inside a function!
Line <54> newline
Line <54> newline Line <54> newline
Line <55> newline Line <55> newline
Line <55> newline
Line <56> bracketo [
Line <56> name newblock
Line <56> colon :
Line <56> name function
Line <56> parao (
Line <56> name a
Line <56> seperator ,
Line <56> name b
Line <56> seperator ,
Line <56> name c
Line <56> parac )
Line <56> bracketc ]
Line <56> newline Line <56> newline
Line <56> newline
Line <57> string Func Arguments: a = `a`, b = `b`, c = `c`
Line <57> newline Line <57> newline
Line <57> newline Line <57> newline
Line <58> string Time to return Line <58> bracketo [
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> ret Line <59> string Func Arguments: a = `a`, b = `b`, c = `c`
Line <59> name a
Line <59> plus +
Line <59> name b
Line <59> plus +
Line <59> name c
Line <59> newline Line <59> newline
Line <59> newline Line <59> newline
Line <59> eof Line <60> string Time to return
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> eof
Line <1> newline Line <1> newline
Line <1> newline Line <1> newline
Line <1> bracketo [ Line <1> bracketo [

View File

@ -1,12 +0,0 @@
#pragma once
#include "value.h"
#include "utils.h"
#include "dms_state.h"
#include <limits>
namespace dms::number_utils {
dms_number* huge(dms_state* state);
dms_number* tiny(dms_state* state);
dms_number* abs(dms_state* state, dms_args args);
dms_number* max(dms_state* state, dms_args args);
dms_number* pow(dms_state* state, dms_args args);
}

View File

@ -1,21 +0,0 @@
#pragma once
#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>
#include "value.h"
#include "dms_state.h"
#include "dms_exceptions.h"
#include "utils.h"
#include "errors.h"
namespace dms::string_utils {
dms_string* reverse(dms_state* state, dms_args args);
dms_string* sub(dms_state* state, dms_args args);
dms_string* upper(dms_state* state, dms_args args);
dms_string* lower(dms_state* state, dms_args args);
dms_boolean* startsWith(dms_state* state, dms_args args);
dms_boolean* endsWith(dms_state* state, dms_args args);
dms_number* indexOf(dms_state* state, dms_args args);
dms_boolean* includes(dms_state* state, dms_args args);
dms_string* repeat(dms_state* state, dms_args args);
}

View File

@ -1,9 +1,8 @@
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 forseelabels enable forwardlabels // Do most of your labels exist ahead?
enable savestate enable savestate
disable fullname
//enable leaking //enable leaking
//enable debugging //enable debugging
loadfile "loadtest.dms" loadfile "loadtest.dms"
@ -14,30 +13,34 @@ using extendedDefine
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."
a = 1000 a = 1000
imp = "this"
test = invokeTest("Running external code!"); test = invokeTest("Running external code!");
"Loop Test... `test`" "Loop Test... `test`"
choice "Pick one" { choice "Pick one" {
"this" goto "this" "this" goto imp
"that" goto ("that") "that" goto ("that")
} }
::this:: ::this::
"At \"this\"" "At \"this\""
goto ("loop") goto "loop"
::that:: ::that::
"At \"that\"" "At \"that\""
::loop:: ::loop::
a = a + 1 a = a + 1
"a = `a`" "a = `a`"
goto ("loop") goto ("loop")
// if (this==that) this()|that()
// if(this == that){
// } else if (that > this) { if (this==that) this()|that()
// } else {
// } if(this == that){
} else if (that > this) {
} else {
}
[Bob:char] [Bob:char]
//fname = "Bob" //fname = "Bob"