many bug fixes and some wip features
This commit is contained in:
parent
da247dc5f0
commit
7f3e8a5ebc
16
DMS.xml
16
DMS.xml
@ -24,20 +24,20 @@
|
||||
<Keywords name="Folders in comment, open">/*</Keywords>
|
||||
<Keywords name="Folders in comment, middle"></Keywords>
|
||||
<Keywords name="Folders in comment, close">*/</Keywords>
|
||||
<Keywords name="Keywords1">ENABLE DISABLE LOAD ENTRY</Keywords>
|
||||
<Keywords name="Keywords2">if then return</Keywords>
|
||||
<Keywords name="Keywords3">leaking debugging</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="Keywords1">ENABLE DISABLE LOAD ENTRY VERSION</Keywords>
|
||||
<Keywords name="Keywords2">if then return and or</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 random getInput</Keywords>
|
||||
<Keywords name="Keywords5"></Keywords>
|
||||
<Keywords name="Keywords6"></Keywords>
|
||||
<Keywords name="Keywords7"></Keywords>
|
||||
<Keywords name="Keywords8"></Keywords>
|
||||
<Keywords name="Delimiters">00:: 01 02:: 03 04 05 06" 07 08" 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" 07 08" 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
|
||||
</KeywordLists>
|
||||
<Styles>
|
||||
<WordsStyle name="DEFAULT" fgColor="C3C3C3" 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="LINE COMMENTS" fgColor="808080" bgColor="293134" 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="707070" bgColor="293134" fontName="Monospac821 BT" fontStyle="1" 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="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" />
|
||||
|
||||
10
parseManager/extendedDefine.lua
Normal file
10
parseManager/extendedDefine.lua
Normal 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
|
||||
@ -1,5 +1,6 @@
|
||||
require("bin")
|
||||
parseManager={}
|
||||
parseManager.VERSION = 3.4
|
||||
parseManager.__index=parseManager
|
||||
parseManager.chunks={}
|
||||
parseManager.stats={}
|
||||
@ -22,8 +23,8 @@ function readonlytable(tab)
|
||||
__metatable=false
|
||||
})
|
||||
end
|
||||
function debug(...)
|
||||
if parseManager.stats.debugging then
|
||||
function parseManager:debug(...)
|
||||
if self.stats.debugging then
|
||||
print("<DEBUG>",...)
|
||||
end
|
||||
end
|
||||
@ -87,21 +88,42 @@ function parseManager:load(path,c)
|
||||
file.data=file.data:gsub("\2","//")
|
||||
file.data=file.data:gsub("\t","")
|
||||
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
|
||||
debug("E",fn)
|
||||
self.stats[string.lower(fn)]=true
|
||||
self:debug("E",fn)
|
||||
c.stats[string.lower(fn)]=true
|
||||
end
|
||||
for fn in file:gmatch("LOAD (.-)\n") do
|
||||
self:debug("L",fn)
|
||||
c:load(fn,c)
|
||||
end
|
||||
for fn in file:gmatch("DISABLE (.-)\n") do
|
||||
debug("D",fn)
|
||||
self.stats[string.lower(fn)]=false
|
||||
self:debug("D",fn)
|
||||
c.stats[string.lower(fn)]=false
|
||||
end
|
||||
for fn in file:gmatch("ENTRY (.-)\n") do
|
||||
debug("E",fn)
|
||||
self.entry=fn
|
||||
self:debug("E",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
|
||||
for name,data in file:gmatch("%[(.-)[:.-]?%].-{(.-)}") do
|
||||
local ctype="BLOCK"
|
||||
@ -264,7 +286,30 @@ function table.print(tbl, indent)
|
||||
end
|
||||
end
|
||||
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
|
||||
local function pieceList(list,self,name)
|
||||
if #list==0 then
|
||||
@ -363,8 +408,8 @@ function parseManager:compileAssign(assignA,assignB,name)
|
||||
for k=1,#listA do
|
||||
local mathTest=false
|
||||
local parsetest=false
|
||||
debug("VAL: "..listB[k])
|
||||
debug("NAME: "..listA[k])
|
||||
self:debug("VAL: "..listB[k])
|
||||
self:debug("NAME: "..listA[k])
|
||||
if tonumber(listB[k]) then
|
||||
assign.vals[#assign.vals+1]=tonumber(listB[k])
|
||||
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
|
||||
assign.vars[#assign.vars+1]=pieceAssign(listA[k],self,name)
|
||||
else
|
||||
debug(assignA,assignB,name)
|
||||
self:debug(assignA,assignB,name)
|
||||
end
|
||||
end
|
||||
table.insert(self.chunks[name],assign)
|
||||
@ -587,13 +632,6 @@ function parseManager:compileLogic(condition,iff,elsee,name)
|
||||
conds=conds.." or 1==0"
|
||||
conds=conds:gsub(" and ","\4")
|
||||
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 mathass=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("%)",""))
|
||||
if l=="true" then
|
||||
-- print("L",1,r)
|
||||
cmds.args[1]=true
|
||||
elseif l=="false" then
|
||||
-- print("L",2,r)
|
||||
cmds.args[1]=false
|
||||
elseif tonumber(l) then
|
||||
-- print("L",3,r)
|
||||
cmds.args[1]=tonumber(l)
|
||||
elseif l:match("[%w_]+")==l then
|
||||
-- print("L",4,r)
|
||||
cmds.args[1]="\1"..l
|
||||
elseif l:match("[%._%w%+%-/%*%^%(%)%%]+")==l then
|
||||
-- print("L",5,r)
|
||||
self:compileExpr("&"..charM,l,name)
|
||||
cmds.args[1]="\1&"..charM
|
||||
mathass=mathass+1
|
||||
elseif l:sub(1,1)=="\"" and l:sub(-1,-1) then
|
||||
-- print("L",6,r)
|
||||
cmds.args[1]=l:sub(2,-2)
|
||||
else
|
||||
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","")
|
||||
charM=string.char(mathass+65)
|
||||
if r=="true" then
|
||||
-- print(1,r)
|
||||
cmds.args[2]=true
|
||||
elseif r=="false" then
|
||||
-- print(2,r)
|
||||
cmds.args[2]=false
|
||||
elseif tonumber(r) then
|
||||
-- print(3,r)
|
||||
cmds.args[2]=tonumber(r)
|
||||
elseif r:match("[%w_]+")==r then
|
||||
-- print(4,r)
|
||||
cmds.args[2]="\1"..r
|
||||
elseif r:match("[_%w%+%-/%*%^%(%)%%]+")==r then
|
||||
-- print(5,r)
|
||||
self:compileExpr("&"..charM,r,name)
|
||||
cmds.args[2]="\1&"..charM
|
||||
mathass=mathass+1
|
||||
elseif r:sub(1,1)=="\"" and r:sub(-1,-1) then
|
||||
-- print(6,r)
|
||||
cmds.args[2]=r:sub(2,-2)
|
||||
else
|
||||
self:pushError("Invalid Syntax in logical expression!",r)
|
||||
@ -709,7 +735,7 @@ function parseManager:compile(name,ctype,data)
|
||||
args=pieceList(FBArgs,self,name)
|
||||
})
|
||||
end
|
||||
debug("COMPILING Block: "..name)
|
||||
self:debug("COMPILING Block: "..name)
|
||||
local data=bin.new(data):lines()
|
||||
local choiceBlock=false
|
||||
local choice={}
|
||||
@ -934,7 +960,7 @@ function parseManager:parseHeader2(data)
|
||||
end
|
||||
else
|
||||
-- regular strings
|
||||
debug("PARSE DATA: "..tostring(self.currentENV[dat]))
|
||||
self:debug("PARSE DATA: "..tostring(self.currentENV[dat]))
|
||||
if self.currentENV[dat]~=nil then
|
||||
if type(self.currentENV[dat])=="table" then
|
||||
local str={}
|
||||
@ -953,7 +979,7 @@ end
|
||||
function parseManager:parseHeader(data)
|
||||
if type(data)=="string" then
|
||||
data=data:gsub("%$([%w_,:%.%[%]%-\"']+)%$",function(dat)
|
||||
debug("PARSE: "..dat)
|
||||
self:debug("PARSE: "..dat)
|
||||
if dat:find(":") and not dat:find("%[") then
|
||||
local var,num = dat:match("(.-):(.+)")
|
||||
local num = tonumber(num)
|
||||
@ -1010,7 +1036,7 @@ function parseManager:parseHeader(data)
|
||||
end
|
||||
else
|
||||
-- regular strings
|
||||
debug("PARSE DATA: "..tostring(self.currentENV[dat]))
|
||||
self:debug("PARSE DATA: "..tostring(self.currentENV[dat]))
|
||||
if self.currentENV[dat]~=nil then
|
||||
if type(self.currentENV[dat])=="table" then
|
||||
local str=""
|
||||
@ -1032,8 +1058,8 @@ function parseManager:parseHeader(data)
|
||||
end
|
||||
function parseManager:pairAssign(vars,vals,envF)
|
||||
for i=1,#vars do
|
||||
debug("ASSIGN NAME: "..tostring(vars[i]))
|
||||
debug("ASSIGN DATA: "..tostring(self:dataToValue(vals[i],envF)))
|
||||
self:debug("ASSIGN NAME: "..tostring(vars[i]))
|
||||
self:debug("ASSIGN DATA: "..tostring(self:dataToValue(vals[i],envF)))
|
||||
if type(vars[i])=="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].."\"]")
|
||||
@ -1069,7 +1095,7 @@ function parseManager:next(block,choice)
|
||||
data=chunk[chunk.pos]
|
||||
end
|
||||
chunk.pos=chunk.pos+1
|
||||
debug("TYPE: "..data.Type)
|
||||
self:debug("TYPE: "..data.Type)
|
||||
if data.Type=="text" then
|
||||
self.lastCall=nil
|
||||
return {Type="text",text=self:parseHeader(data.text)}
|
||||
|
||||
26
test.lua
26
test.lua
@ -3,19 +3,19 @@ local bin = require("bin")
|
||||
--~ local multi = require("multi")
|
||||
require("parseManager")
|
||||
require("bit")
|
||||
parseManager:define({
|
||||
rshift=function(self,a,b)
|
||||
return bit.rshift(a,b)
|
||||
end,
|
||||
lshift=function(self,a,b)
|
||||
return bit.lshift(a,b)
|
||||
end,
|
||||
testfunc=function(self,a,b,c)
|
||||
print(tostring(a).." "..tostring(b).." "..tostring(c))
|
||||
end
|
||||
})
|
||||
test=parseManager:load("parsetest3.txt")
|
||||
print(test:dump())
|
||||
--~ parseManager:define({
|
||||
--~ rshift=function(self,a,b)
|
||||
--~ return bit.rshift(a,b)
|
||||
--~ end,
|
||||
--~ lshift=function(self,a,b)
|
||||
--~ return bit.lshift(a,b)
|
||||
--~ end,
|
||||
--~ testfunc=function(self,a,b,c)
|
||||
--~ print(tostring(a).." "..tostring(b).." "..tostring(c))
|
||||
--~ end
|
||||
--~ })
|
||||
test=parseManager:load("textadventure.dms")
|
||||
--~ print(test:dump())
|
||||
t=test:next()
|
||||
while true do
|
||||
if not t then break end
|
||||
|
||||
21
test2.lua
21
test2.lua
@ -1,5 +1,16 @@
|
||||
function round(num, numDecimalPlaces)
|
||||
local mult = 10^(numDecimalPlaces or 0)
|
||||
return math.floor(num * mult + 0.5) / mult
|
||||
end
|
||||
print(round(123456.345,2))
|
||||
io.flush()
|
||||
i = io.input()
|
||||
i:seek("cur")
|
||||
i:read(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
14
textadventure.dms
Normal 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")
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user