many bug fixes and some wip features

This commit is contained in:
Ryan Ward 2019-01-07 20:19:58 -05:00
parent da247dc5f0
commit 7f3e8a5ebc
9 changed files with 129 additions and 68 deletions

16
DMS.xml
View File

@ -24,20 +24,20 @@
<Keywords name="Folders in comment, open">/*</Keywords> <Keywords name="Folders in comment, open">/*</Keywords>
<Keywords name="Folders in comment, middle"></Keywords> <Keywords name="Folders in comment, middle"></Keywords>
<Keywords name="Folders in comment, close">*/</Keywords> <Keywords name="Folders in comment, close">*/</Keywords>
<Keywords name="Keywords1">ENABLE DISABLE LOAD ENTRY</Keywords> <Keywords name="Keywords1">ENABLE DISABLE LOAD ENTRY VERSION</Keywords>
<Keywords name="Keywords2">if then return</Keywords> <Keywords name="Keywords2">if then return and or</Keywords>
<Keywords name="Keywords3">leaking debugging</Keywords> <Keywords name="Keywords3">leaking debugging warnings</Keywords>
<Keywords name="Keywords4">ceil tan CSIM log10 sinh GOTOE lshift deg MUL QUIT cosh exp rad GOTO SUB log ADD JUMP error POW randomseed floor tanh max atan SKIP acos DIV abs rshif COMPARE print atan2 asin cos sin mod sqrt function</Keywords> <Keywords name="Keywords4">ceil tan CSIM log10 sinh GOTOE lshift deg MUL QUIT cosh exp rad GOTO SUB log ADD JUMP error POW randomseed floor tanh max atan SKIP acos DIV abs rshif COMPARE print atan2 asin cos sin mod sqrt function random getInput</Keywords>
<Keywords name="Keywords5"></Keywords> <Keywords name="Keywords5"></Keywords>
<Keywords name="Keywords6"></Keywords> <Keywords name="Keywords6"></Keywords>
<Keywords name="Keywords7"></Keywords> <Keywords name="Keywords7"></Keywords>
<Keywords name="Keywords8"></Keywords> <Keywords name="Keywords8"></Keywords>
<Keywords name="Delimiters">00:: 01 02:: 03 04 05 06&quot; 07 08&quot; 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords> <Keywords name="Delimiters">00:: 01 02:: 03$ 04 05$ 06&quot; 07 08&quot; 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
</KeywordLists> </KeywordLists>
<Styles> <Styles>
<WordsStyle name="DEFAULT" fgColor="C3C3C3" bgColor="293135" fontName="Monospac821 BT" fontStyle="0" fontSize="12" nesting="0" /> <WordsStyle name="DEFAULT" fgColor="D4D4D4" bgColor="293135" fontName="Monospac821 BT" fontStyle="0" fontSize="12" nesting="0" />
<WordsStyle name="COMMENTS" fgColor="808080" bgColor="293134" fontName="Monospac821 BT" fontStyle="0" fontSize="12" nesting="0" /> <WordsStyle name="COMMENTS" fgColor="707070" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" fontSize="12" nesting="0" />
<WordsStyle name="LINE COMMENTS" fgColor="808080" bgColor="293134" fontName="Monospac821 BT" fontStyle="0" fontSize="12" nesting="0" /> <WordsStyle name="LINE COMMENTS" fgColor="707070" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" fontSize="12" nesting="0" />
<WordsStyle name="NUMBERS" fgColor="FF8080" bgColor="293134" fontName="Monospac821 BT" fontStyle="0" fontSize="12" nesting="0" /> <WordsStyle name="NUMBERS" fgColor="FF8080" bgColor="293134" fontName="Monospac821 BT" fontStyle="0" fontSize="12" nesting="0" />
<WordsStyle name="KEYWORDS1" fgColor="FF8000" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" fontSize="12" nesting="0" /> <WordsStyle name="KEYWORDS1" fgColor="FF8000" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" fontSize="12" nesting="0" />
<WordsStyle name="KEYWORDS2" fgColor="0080C0" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" fontSize="12" nesting="0" /> <WordsStyle name="KEYWORDS2" fgColor="0080C0" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" fontSize="12" nesting="0" />

View File

@ -0,0 +1,10 @@
function parseManager:extendedDefine()
self:define{
newThread = function()
-- We allow for thread creation
end,
testfunc = function()
print("It worked")
end,
}
end

View File

@ -1,5 +1,6 @@
require("bin") require("bin")
parseManager={} parseManager={}
parseManager.VERSION = 3.4
parseManager.__index=parseManager parseManager.__index=parseManager
parseManager.chunks={} parseManager.chunks={}
parseManager.stats={} parseManager.stats={}
@ -22,8 +23,8 @@ function readonlytable(tab)
__metatable=false __metatable=false
}) })
end end
function debug(...) function parseManager:debug(...)
if parseManager.stats.debugging then if self.stats.debugging then
print("<DEBUG>",...) print("<DEBUG>",...)
end end
end end
@ -87,21 +88,42 @@ function parseManager:load(path,c)
file.data=file.data:gsub("\2","//") file.data=file.data:gsub("\2","//")
file.data=file.data:gsub("\t","") file.data=file.data:gsub("\t","")
file:trim() file:trim()
for fn in file:gmatch("LOAD (.-)\n") do
debug("L",fn)
self:load(fn,c)
end
for fn in file:gmatch("ENABLE (.-)\n") do for fn in file:gmatch("ENABLE (.-)\n") do
debug("E",fn) self:debug("E",fn)
self.stats[string.lower(fn)]=true c.stats[string.lower(fn)]=true
end
for fn in file:gmatch("LOAD (.-)\n") do
self:debug("L",fn)
c:load(fn,c)
end end
for fn in file:gmatch("DISABLE (.-)\n") do for fn in file:gmatch("DISABLE (.-)\n") do
debug("D",fn) self:debug("D",fn)
self.stats[string.lower(fn)]=false c.stats[string.lower(fn)]=false
end end
for fn in file:gmatch("ENTRY (.-)\n") do for fn in file:gmatch("ENTRY (.-)\n") do
debug("E",fn) self:debug("E",fn)
self.entry=fn c.entry=fn
end
for fn in file:gmatch("USING (.-)\n") do
self:debug("U",fn)
local m = require("parseManager."..fn)
if not m then
self:pushError(fn.." was not found as an import that can be used!")
else
c[fn](c)
end
end
for fn in file:gmatch("VERSION (.-)\n") do
self:debug("V",fn)
local num = tonumber(fn)
local int = tonumber(c.VERSION)
if not num then
c:pushWarning("VERSION: "..fn.." is not valid! Assuming "..c.VERSION)
else
if num>int then
c:pushWarning("This script was written for a version that is greater than what this interperter was built for!")
end
end
end end
for name,data in file:gmatch("%[(.-)[:.-]?%].-{(.-)}") do for name,data in file:gmatch("%[(.-)[:.-]?%].-{(.-)}") do
local ctype="BLOCK" local ctype="BLOCK"
@ -264,7 +286,30 @@ function table.print(tbl, indent)
end end
end end
function parseManager:pushError(err,sym) function parseManager:pushError(err,sym)
error(err.." "..tostring(sym)) local lines = bin.load(self.currentChunk.path):lines()
local chunk = self.currentChunk[self.currentChunk.pos-1]
-- table.print(chunk)
for i=1,#lines do
if sym then
if lines[i]:find(sym) then
print(err.." At line: "..i.." "..(lines[i]:gsub("^\t+","")).." ("..tostring(sym)..")")
break
end
elseif chunk.Type=="fwor" or chunk.Type=="fwr" then
if lines[i]:match(chunk.Func.."%(") then
print(err.." At line: "..i.." "..(lines[i]:gsub("^\t+","")).." ("..tostring(sym)..")")
break
end
else
end
end
io.read()
os.exit()
end
function parseManager:pushWarning(warn)
if not self.stats["warnings"] then return end
print("WARNING: "..warn)
end end
local function pieceList(list,self,name) local function pieceList(list,self,name)
if #list==0 then if #list==0 then
@ -363,8 +408,8 @@ function parseManager:compileAssign(assignA,assignB,name)
for k=1,#listA do for k=1,#listA do
local mathTest=false local mathTest=false
local parsetest=false local parsetest=false
debug("VAL: "..listB[k]) self:debug("VAL: "..listB[k])
debug("NAME: "..listA[k]) self:debug("NAME: "..listA[k])
if tonumber(listB[k]) then if tonumber(listB[k]) then
assign.vals[#assign.vals+1]=tonumber(listB[k]) assign.vals[#assign.vals+1]=tonumber(listB[k])
elseif listB[k]:sub(1,1)=="[" and listB[k]:sub(-1,-1)=="]" then elseif listB[k]:sub(1,1)=="[" and listB[k]:sub(-1,-1)=="]" then
@ -404,7 +449,7 @@ function parseManager:compileAssign(assignA,assignB,name)
if not mathTest and not parsetest then if not mathTest and not parsetest then
assign.vars[#assign.vars+1]=pieceAssign(listA[k],self,name) assign.vars[#assign.vars+1]=pieceAssign(listA[k],self,name)
else else
debug(assignA,assignB,name) self:debug(assignA,assignB,name)
end end
end end
table.insert(self.chunks[name],assign) table.insert(self.chunks[name],assign)
@ -587,13 +632,6 @@ function parseManager:compileLogic(condition,iff,elsee,name)
conds=conds.." or 1==0" conds=conds.." or 1==0"
conds=conds:gsub(" and ","\4") conds=conds:gsub(" and ","\4")
conds=conds:gsub(" or ","\5") conds=conds:gsub(" or ","\5")
-- conds=conds:gsub("(\".*[\4].*\")",function(a)
-- return a:gsub("\4"," and ")
-- end)
-- print(conds)
-- conds=conds:gsub("(\".*[\5].*\")",function(a)
-- return a:gsub("\4"," or ")
-- end)
local count=0 local count=0
local mathass=0 local mathass=0
_conds=conds:gsub("%s*\5".."1==0","") _conds=conds:gsub("%s*\5".."1==0","")
@ -610,24 +648,18 @@ function parseManager:compileLogic(condition,iff,elsee,name)
} }
local l,r=(l:gsub("[\4\5\6]*%(","")),(r:gsub("%)","")) local l,r=(l:gsub("[\4\5\6]*%(","")),(r:gsub("%)",""))
if l=="true" then if l=="true" then
-- print("L",1,r)
cmds.args[1]=true cmds.args[1]=true
elseif l=="false" then elseif l=="false" then
-- print("L",2,r)
cmds.args[1]=false cmds.args[1]=false
elseif tonumber(l) then elseif tonumber(l) then
-- print("L",3,r)
cmds.args[1]=tonumber(l) cmds.args[1]=tonumber(l)
elseif l:match("[%w_]+")==l then elseif l:match("[%w_]+")==l then
-- print("L",4,r)
cmds.args[1]="\1"..l cmds.args[1]="\1"..l
elseif l:match("[%._%w%+%-/%*%^%(%)%%]+")==l then elseif l:match("[%._%w%+%-/%*%^%(%)%%]+")==l then
-- print("L",5,r)
self:compileExpr("&"..charM,l,name) self:compileExpr("&"..charM,l,name)
cmds.args[1]="\1&"..charM cmds.args[1]="\1&"..charM
mathass=mathass+1 mathass=mathass+1
elseif l:sub(1,1)=="\"" and l:sub(-1,-1) then elseif l:sub(1,1)=="\"" and l:sub(-1,-1) then
-- print("L",6,r)
cmds.args[1]=l:sub(2,-2) cmds.args[1]=l:sub(2,-2)
else else
self:pushError("Invalid Syntax in logical expression!",l) self:pushError("Invalid Syntax in logical expression!",l)
@ -635,24 +667,18 @@ function parseManager:compileLogic(condition,iff,elsee,name)
r=r:gsub("%s*\5".."1==0","") r=r:gsub("%s*\5".."1==0","")
charM=string.char(mathass+65) charM=string.char(mathass+65)
if r=="true" then if r=="true" then
-- print(1,r)
cmds.args[2]=true cmds.args[2]=true
elseif r=="false" then elseif r=="false" then
-- print(2,r)
cmds.args[2]=false cmds.args[2]=false
elseif tonumber(r) then elseif tonumber(r) then
-- print(3,r)
cmds.args[2]=tonumber(r) cmds.args[2]=tonumber(r)
elseif r:match("[%w_]+")==r then elseif r:match("[%w_]+")==r then
-- print(4,r)
cmds.args[2]="\1"..r cmds.args[2]="\1"..r
elseif r:match("[_%w%+%-/%*%^%(%)%%]+")==r then elseif r:match("[_%w%+%-/%*%^%(%)%%]+")==r then
-- print(5,r)
self:compileExpr("&"..charM,r,name) self:compileExpr("&"..charM,r,name)
cmds.args[2]="\1&"..charM cmds.args[2]="\1&"..charM
mathass=mathass+1 mathass=mathass+1
elseif r:sub(1,1)=="\"" and r:sub(-1,-1) then elseif r:sub(1,1)=="\"" and r:sub(-1,-1) then
-- print(6,r)
cmds.args[2]=r:sub(2,-2) cmds.args[2]=r:sub(2,-2)
else else
self:pushError("Invalid Syntax in logical expression!",r) self:pushError("Invalid Syntax in logical expression!",r)
@ -709,7 +735,7 @@ function parseManager:compile(name,ctype,data)
args=pieceList(FBArgs,self,name) args=pieceList(FBArgs,self,name)
}) })
end end
debug("COMPILING Block: "..name) self:debug("COMPILING Block: "..name)
local data=bin.new(data):lines() local data=bin.new(data):lines()
local choiceBlock=false local choiceBlock=false
local choice={} local choice={}
@ -934,7 +960,7 @@ function parseManager:parseHeader2(data)
end end
else else
-- regular strings -- regular strings
debug("PARSE DATA: "..tostring(self.currentENV[dat])) self:debug("PARSE DATA: "..tostring(self.currentENV[dat]))
if self.currentENV[dat]~=nil then if self.currentENV[dat]~=nil then
if type(self.currentENV[dat])=="table" then if type(self.currentENV[dat])=="table" then
local str={} local str={}
@ -953,7 +979,7 @@ end
function parseManager:parseHeader(data) function parseManager:parseHeader(data)
if type(data)=="string" then if type(data)=="string" then
data=data:gsub("%$([%w_,:%.%[%]%-\"']+)%$",function(dat) data=data:gsub("%$([%w_,:%.%[%]%-\"']+)%$",function(dat)
debug("PARSE: "..dat) self:debug("PARSE: "..dat)
if dat:find(":") and not dat:find("%[") then if dat:find(":") and not dat:find("%[") then
local var,num = dat:match("(.-):(.+)") local var,num = dat:match("(.-):(.+)")
local num = tonumber(num) local num = tonumber(num)
@ -1010,7 +1036,7 @@ function parseManager:parseHeader(data)
end end
else else
-- regular strings -- regular strings
debug("PARSE DATA: "..tostring(self.currentENV[dat])) self:debug("PARSE DATA: "..tostring(self.currentENV[dat]))
if self.currentENV[dat]~=nil then if self.currentENV[dat]~=nil then
if type(self.currentENV[dat])=="table" then if type(self.currentENV[dat])=="table" then
local str="" local str=""
@ -1032,8 +1058,8 @@ function parseManager:parseHeader(data)
end end
function parseManager:pairAssign(vars,vals,envF) function parseManager:pairAssign(vars,vals,envF)
for i=1,#vars do for i=1,#vars do
debug("ASSIGN NAME: "..tostring(vars[i])) self:debug("ASSIGN NAME: "..tostring(vars[i]))
debug("ASSIGN DATA: "..tostring(self:dataToValue(vals[i],envF))) self:debug("ASSIGN DATA: "..tostring(self:dataToValue(vals[i],envF)))
if type(vars[i])=="table" then if type(vars[i])=="table" then
if type(self.currentENV[vars[i][1]])~="table" then if type(self.currentENV[vars[i][1]])~="table" then
self:pushError("Attempt to index a non table object:",vars[i][1].."[\""..vars[i][2].."\"]") self:pushError("Attempt to index a non table object:",vars[i][1].."[\""..vars[i][2].."\"]")
@ -1069,7 +1095,7 @@ function parseManager:next(block,choice)
data=chunk[chunk.pos] data=chunk[chunk.pos]
end end
chunk.pos=chunk.pos+1 chunk.pos=chunk.pos+1
debug("TYPE: "..data.Type) self:debug("TYPE: "..data.Type)
if data.Type=="text" then if data.Type=="text" then
self.lastCall=nil self.lastCall=nil
return {Type="text",text=self:parseHeader(data.text)} return {Type="text",text=self:parseHeader(data.text)}

View File

@ -3,19 +3,19 @@ local bin = require("bin")
--~ local multi = require("multi") --~ local multi = require("multi")
require("parseManager") require("parseManager")
require("bit") require("bit")
parseManager:define({ --~ parseManager:define({
rshift=function(self,a,b) --~ rshift=function(self,a,b)
return bit.rshift(a,b) --~ return bit.rshift(a,b)
end, --~ end,
lshift=function(self,a,b) --~ lshift=function(self,a,b)
return bit.lshift(a,b) --~ return bit.lshift(a,b)
end, --~ end,
testfunc=function(self,a,b,c) --~ testfunc=function(self,a,b,c)
print(tostring(a).." "..tostring(b).." "..tostring(c)) --~ print(tostring(a).." "..tostring(b).." "..tostring(c))
end --~ end
}) --~ })
test=parseManager:load("parsetest3.txt") test=parseManager:load("textadventure.dms")
print(test:dump()) --~ print(test:dump())
t=test:next() t=test:next()
while true do while true do
if not t then break end if not t then break end

View File

@ -1,5 +1,16 @@
function round(num, numDecimalPlaces) io.flush()
local mult = 10^(numDecimalPlaces or 0) i = io.input()
return math.floor(num * mult + 0.5) / mult i:seek("cur")
end i:read(2)
print(round(123456.345,2)) print(i)
--~ g={}
--~ while t~="q" do
--~ g[#g+1]=t
--~ io.flush()
--~ t=io.read(1)
--~ io.write("\b")
--~ end
--~ print("done")
--~ io.write("\b")
--~ io.flush()
--~ io.read()

14
textadventure.dms Normal file
View File

@ -0,0 +1,14 @@
ENTRY MAIN
VERSION 3.4
USING extendedDefine
ENABLE warnings
// ENABLE debugging
[MAIN]{
::name::
name = getInput("Enter your name: ")
if name=="" then GOTO("name")|SKIP(0)
::good::
print("Player Name: $name$")
choice = getInput("Is this name correct? (y/n): ")
if choice=="y" then SKIP(0)|GOTO("name")
}