Added the test code to the core
Still WIP though
This commit is contained in:
parent
cb1dd2fea6
commit
5c31a9c274
@ -1037,6 +1037,125 @@ function parseManager:next(chunk,a,env,dd)
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
function parseManager:RunCode(code,entry,sel,env) -- returns an env or selectVarName
|
||||||
|
local file = bin.new("ENTRY "..(entry or "START").."\n"..code)
|
||||||
|
local run=parseManager:load(file)
|
||||||
|
run._methods = self._methods
|
||||||
|
run.defualtENV=self.defualtENV
|
||||||
|
run.defualtENV=self.defualtENV
|
||||||
|
for i,v in pairs(env or {}) do
|
||||||
|
run.defualtENV[i]=v
|
||||||
|
end
|
||||||
|
local t=run:start()
|
||||||
|
while true do
|
||||||
|
if t.Type=="text" then
|
||||||
|
print(t.text)
|
||||||
|
t=run:next()
|
||||||
|
elseif t.Type=="condition" then
|
||||||
|
t=run:next()
|
||||||
|
elseif t.Type=="assignment" then
|
||||||
|
t=run:next()
|
||||||
|
elseif t.Type=="label" then
|
||||||
|
t=run:next()
|
||||||
|
elseif t.Type=="method" then
|
||||||
|
t=run:next()
|
||||||
|
elseif t.Type=="choice" then
|
||||||
|
t=run:next(nil,math.random(1,#t.choices),nil,t)
|
||||||
|
elseif t.Type=="end" then
|
||||||
|
if t.text=="leaking" then -- go directly to the block right under the current block if it exists
|
||||||
|
t=run:next()
|
||||||
|
else
|
||||||
|
return (run.defualtENV[sel] or run.defualtENV)
|
||||||
|
end
|
||||||
|
elseif t.Type=="error" then
|
||||||
|
error(t.text)
|
||||||
|
else
|
||||||
|
t=run:next()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
parseManager.symbols={} -- {sym,code}
|
||||||
|
function parseManager:registerSymbol(sym,code)
|
||||||
|
self.symbols[#self.symbols+1]={sym,code}
|
||||||
|
end
|
||||||
|
function parseManager:populateSymbolList(o)
|
||||||
|
local str=""
|
||||||
|
for i=1,#self.symbols do
|
||||||
|
str=self.symbols[i][1]..str
|
||||||
|
end
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
function parseManager:isRegisteredSymbol(o,r,v)
|
||||||
|
for i=1,#self.symbols do
|
||||||
|
if self.symbols[i][1]==o then
|
||||||
|
return parseManager:RunCode(self.symbols[i][2],"CODE","ret-urn",{["l"]=r,["r"]=v,["mainenv"]=self.defualtENV})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false --self:pushError("Invalid Symbol "..o.."!")
|
||||||
|
end
|
||||||
|
function parseManager:evaluate(cmd,v)
|
||||||
|
v=v or 0
|
||||||
|
local loop
|
||||||
|
local count=0
|
||||||
|
local function helper(o,v,r)
|
||||||
|
if type(v)=="string" then
|
||||||
|
if v:find("%D") then
|
||||||
|
v=self:varExists(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if type(r)=="string" then
|
||||||
|
if r:find("%D") then
|
||||||
|
r=self:varExists(r)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local r=tonumber(r) or 0
|
||||||
|
local gg=self:isRegisteredSymbol(o,r,v)
|
||||||
|
if gg then
|
||||||
|
return gg
|
||||||
|
elseif o=="+" then
|
||||||
|
return r+v
|
||||||
|
elseif o=="-" then
|
||||||
|
return r-v
|
||||||
|
elseif o=="/" then
|
||||||
|
return r/v
|
||||||
|
elseif o=="*" then
|
||||||
|
return r*v
|
||||||
|
elseif o=="^" then
|
||||||
|
return r^v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i,v in pairs(math) do
|
||||||
|
cmd=cmd:gsub(i.."(%b())",function(a)
|
||||||
|
a=a:sub(2,-2)
|
||||||
|
if a:sub(1,1)=="-" then
|
||||||
|
a="0"..a
|
||||||
|
end
|
||||||
|
return v(self:evaluate(a))
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
cmd=cmd:gsub("%b()",function(a)
|
||||||
|
return self:evaluate(a:sub(2,-2))
|
||||||
|
end)
|
||||||
|
for l,o,r in cmd:gmatch("(.*)([%+%^%-%*/"..self:populateSymbolList().."])(.*)") do
|
||||||
|
loop=true
|
||||||
|
count=count+1
|
||||||
|
if l:find("[%+%^%-%*/]") then
|
||||||
|
v=self:evaluate(l,v)
|
||||||
|
v=helper(o,r,v)
|
||||||
|
else
|
||||||
|
if count==1 then
|
||||||
|
v=helper(o,r,l)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not loop then return self:varExists(cmd) end
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
parseManager.constructType=function(self,name,t,data,filename)
|
||||||
|
if t~="construct" then return end
|
||||||
|
--print(name,t,"[CODE]{"..data.."}")
|
||||||
|
self:registerSymbol(name,"[CODE]{"..data.."}")
|
||||||
|
end
|
||||||
-- Let's add function
|
-- Let's add function
|
||||||
Stack = {}
|
Stack = {}
|
||||||
function Stack:Create()
|
function Stack:Create()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user