forked from mtcontrib/pdisc
💥
A .gitignore A LICENSE.txt A README.md A depends.txt A faden.lua A init.lua A parser.lua A standardbefehlssatz.lua A textures/pdisc.png
This commit is contained in:
commit
b3ce57c5b4
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## Generic ignorable patterns and files
|
||||||
|
*~
|
||||||
|
debug.txt
|
||||||
|
*.patch
|
1
LICENSE.txt
Normal file
1
LICENSE.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
WTFPL
|
10
README.md
Normal file
10
README.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
commands are read line by line
|
||||||
|
|
||||||
|
```[<labelname>:] [<commandname> [<arg1>[,<arg2[…]]]] [; <comment>]```
|
||||||
|
|
||||||
|
arguments can be either variables, labels or immediates,
|
||||||
|
labels are replaced with immediates which have the line numbers of the labels as their values
|
||||||
|
true/false: boolean (immediate)
|
||||||
|
12.6: number (immediate)
|
||||||
|
$hello nwae: string (immediate)
|
||||||
|
nodolla: either a label is called so (immediate) or it's a variable
|
1
depends.txt
Normal file
1
depends.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
default
|
93
faden.lua
Normal file
93
faden.lua
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
local function befehl_ausfuhren(faden)
|
||||||
|
local is = faden.is
|
||||||
|
local imms = faden.imms
|
||||||
|
local vars = faden.vars
|
||||||
|
local befehl, args = unpack(faden.liste[faden.ip])
|
||||||
|
for i = 1,#is do
|
||||||
|
local bfunk = is[i]
|
||||||
|
if bfunk then
|
||||||
|
local fa = {}
|
||||||
|
local ersetzbar = {}
|
||||||
|
if args then
|
||||||
|
for i = 1,#args do
|
||||||
|
local arg = args[i]
|
||||||
|
if type(arg) == "number" then
|
||||||
|
fa[i] = imms[arg]
|
||||||
|
else
|
||||||
|
fa[i] = vars[arg]
|
||||||
|
ersetzbar[i] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local weiter, ergebnis = bfunk(fa, faden)
|
||||||
|
if not weiter then
|
||||||
|
return false, "Command " .. befehl .. ": " .. ergebnis
|
||||||
|
end
|
||||||
|
if ergebnis ~= nil then
|
||||||
|
if type(ergebnis) ~= "table" then
|
||||||
|
ergebnis = {ergebnis}
|
||||||
|
end
|
||||||
|
for i,v in pairs(ergebnis) do
|
||||||
|
if not ersetzbar[i] then
|
||||||
|
return false, "Attempt on changing an immediate"
|
||||||
|
end
|
||||||
|
vars[args[i]] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
faden.ip = faden.ip + 1
|
||||||
|
if faden.ip > #faden.liste then
|
||||||
|
return false, "Done"
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false, 'Unknown command "' .. befehl .. '"'
|
||||||
|
end
|
||||||
|
|
||||||
|
local function programm_ausfuhren(faden)
|
||||||
|
local weiter,msg = befehl_ausfuhren(faden)
|
||||||
|
if not weiter then
|
||||||
|
faden.log = faden.log .. "Aborted: " .. msg .. "\n"
|
||||||
|
faden.exit()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return not faden.stopped and programm_ausfuhren(faden)
|
||||||
|
end
|
||||||
|
|
||||||
|
return function (faden_manip, parsed)
|
||||||
|
local faden = {
|
||||||
|
log = "",
|
||||||
|
ip = 1,
|
||||||
|
sp = 50,
|
||||||
|
sb = 50,
|
||||||
|
stack = {},
|
||||||
|
is = {pdisc.standard_befehlssatz},
|
||||||
|
suscitate = programm_ausfuhren,
|
||||||
|
flush = function(self)
|
||||||
|
print(self.log)
|
||||||
|
self.log = ""
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
stop = function(self)
|
||||||
|
self.stopped = true
|
||||||
|
end,
|
||||||
|
continue = function(self)
|
||||||
|
self.stopped = false
|
||||||
|
self:suscitate()
|
||||||
|
end,
|
||||||
|
try_rebirth = function(self)
|
||||||
|
if minetest.get_gametime() < self.rebirth then
|
||||||
|
self:continue()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
exit = function(self)
|
||||||
|
self:flush()
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
if parsed then
|
||||||
|
faden.imms = parsed[1]
|
||||||
|
faden.liste = parsed[2]
|
||||||
|
end
|
||||||
|
faden_manip(faden)
|
||||||
|
return faden
|
||||||
|
end
|
19
init.lua
Normal file
19
init.lua
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
local load_time_start = minetest.get_us_time()
|
||||||
|
|
||||||
|
|
||||||
|
local mpath = minetest.get_modpath"pdisc" .. "/"
|
||||||
|
|
||||||
|
pdisc = {
|
||||||
|
parse = dofile(mpath .. "parser.lua"),
|
||||||
|
standard_befehlssatz = dofile(mpath .. "standardbefehlssatz.lua"),
|
||||||
|
create_thread = dofile(mpath .. "faden.lua")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
local time = (minetest.get_us_time() - load_time_start) / 1000000
|
||||||
|
local msg = "[pdisc] loaded after ca. " .. time .. " seconds."
|
||||||
|
if time > 0.01 then
|
||||||
|
print(msg)
|
||||||
|
else
|
||||||
|
minetest.log("info", msg)
|
||||||
|
end
|
87
parser.lua
Normal file
87
parser.lua
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
local function parse_zeile(marken, imms, z, zn)
|
||||||
|
-- Kommentar entfernen
|
||||||
|
local komment = z:find";"
|
||||||
|
if komment then
|
||||||
|
z = z:sub(1, komment-1)
|
||||||
|
end
|
||||||
|
|
||||||
|
z = z:trim()
|
||||||
|
if #z == 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Marke erkennen
|
||||||
|
local marke = z:find":"
|
||||||
|
if marke then
|
||||||
|
mname = z:sub(1, marke - 1)
|
||||||
|
marken[mname] = zn
|
||||||
|
|
||||||
|
z = z:sub(marke+1):trim()
|
||||||
|
if #z == 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Befehl erkennen
|
||||||
|
local immn = #imms+1
|
||||||
|
local befehl = z
|
||||||
|
local args
|
||||||
|
local leernb = z:find" "
|
||||||
|
if leernb then
|
||||||
|
befehl = z:sub(1, leernb - 1)
|
||||||
|
|
||||||
|
-- Argument(e) erkennen
|
||||||
|
z = z:sub(leernb+1):trim()
|
||||||
|
args = z:split","
|
||||||
|
for i = 1,#args do
|
||||||
|
local arg = args[i]:trim()
|
||||||
|
if #arg == 0
|
||||||
|
or arg == "false" then
|
||||||
|
arg = false
|
||||||
|
elseif arg == "true" then
|
||||||
|
arg = true
|
||||||
|
elseif arg:sub(1, 1) == "$" then
|
||||||
|
imms[immn] = arg:sub(2)
|
||||||
|
arg = immn
|
||||||
|
immn = immn+1
|
||||||
|
elseif tonumber(arg) then
|
||||||
|
imms[immn] = tonumber(arg)
|
||||||
|
arg = immn
|
||||||
|
immn = immn+1
|
||||||
|
end
|
||||||
|
args[i] = arg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {befehl, args}
|
||||||
|
end
|
||||||
|
|
||||||
|
return function(programm)
|
||||||
|
local imms = {}
|
||||||
|
local marken = {}
|
||||||
|
|
||||||
|
-- Programm erkennen
|
||||||
|
local liste = programm:split"\n"
|
||||||
|
local zn = #liste
|
||||||
|
for i = 1,zn do
|
||||||
|
liste[i] = parse_zeile(marken, imms, liste[i], i)
|
||||||
|
end
|
||||||
|
local immn = #imms+1
|
||||||
|
|
||||||
|
-- Marken durch immediates ersetzen
|
||||||
|
for i = 1,zn do
|
||||||
|
local args = liste[i][2]
|
||||||
|
if args then
|
||||||
|
for i = 1,#args do
|
||||||
|
local mwert = marken[args[i]]
|
||||||
|
if mwert then
|
||||||
|
imms[immn] = mwert
|
||||||
|
args[i] = immn
|
||||||
|
immn = immn+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {imms, liste}
|
||||||
|
end
|
138
standardbefehlssatz.lua
Normal file
138
standardbefehlssatz.lua
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
local WNOA = "wrong number of arguments"
|
||||||
|
local UAT = "unsupported argument type"
|
||||||
|
local SE = "error with cmd-cmd executing: "
|
||||||
|
|
||||||
|
local s
|
||||||
|
s = {
|
||||||
|
mov = function(params, faden)
|
||||||
|
if #params ~= 2 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
return true, params[2]
|
||||||
|
end,
|
||||||
|
|
||||||
|
add = function(params)
|
||||||
|
if #params ~= 2 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
local p1,p2 = unpack(params)
|
||||||
|
local t1 = type(p1)
|
||||||
|
local t2 = type(p2)
|
||||||
|
if t1 ~= t2 then
|
||||||
|
return false, "different argument types"
|
||||||
|
end
|
||||||
|
|
||||||
|
if t1 == "number" then
|
||||||
|
return true, p1 + p2
|
||||||
|
end
|
||||||
|
if t1 == "string" then
|
||||||
|
return true, p1 .. p2
|
||||||
|
end
|
||||||
|
return false, UAT
|
||||||
|
end,
|
||||||
|
|
||||||
|
jmp = function(params, faden)
|
||||||
|
if #params ~= 1 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
local p = params[1]
|
||||||
|
if type(p) ~= "number" then
|
||||||
|
return false, UAT
|
||||||
|
end
|
||||||
|
if p < 1
|
||||||
|
or p%1 ~= 0
|
||||||
|
or p > #faden.liste + 1 then
|
||||||
|
return false, "jump target out of range"
|
||||||
|
end
|
||||||
|
faden.ip = p-1
|
||||||
|
if not s.sleep({0}, faden) then
|
||||||
|
error(SE)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
|
||||||
|
jif = function(params, faden)
|
||||||
|
if #params ~= 2 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
if params[1] then
|
||||||
|
local jmpd,msg = s.jmp({params[2]}, faden)
|
||||||
|
if not jmpd then
|
||||||
|
return false, SE .. msg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
|
||||||
|
push = function(params, faden)
|
||||||
|
local pc = #params
|
||||||
|
if pc == 0 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
for i = 1,pc do
|
||||||
|
faden.stack[faden.sp] = params[i]
|
||||||
|
faden.sp = faden.sp-1
|
||||||
|
end
|
||||||
|
if faden.sp < 0 then
|
||||||
|
return false, "stack overflow"
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
|
||||||
|
pop = function(params, faden)
|
||||||
|
local pc = #params
|
||||||
|
if pc == 0 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
local rt = {}
|
||||||
|
for i = 1,pc do
|
||||||
|
faden.sp = faden.sp+1
|
||||||
|
rt[i] = faden.stack[faden.sp]
|
||||||
|
end
|
||||||
|
if faden.sp > faden.sb then
|
||||||
|
return false, "stack underflow"
|
||||||
|
end
|
||||||
|
return true, rt
|
||||||
|
end,
|
||||||
|
|
||||||
|
equal = function(params, faden)
|
||||||
|
if #params ~= 2 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
return true, params[1] == params[2]
|
||||||
|
end,
|
||||||
|
|
||||||
|
less = function(params, faden)
|
||||||
|
if #params ~= 2 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
local t1 = type(p1)
|
||||||
|
local t2 = type(p2)
|
||||||
|
if t1 ~= t2 then
|
||||||
|
return false, "different argument types"
|
||||||
|
end
|
||||||
|
if t1 ~= "number"
|
||||||
|
and t1 ~= "string" then
|
||||||
|
return false, UAT
|
||||||
|
end
|
||||||
|
return true, params[1] < params[2]
|
||||||
|
end,
|
||||||
|
|
||||||
|
sleep = function(params, faden)
|
||||||
|
if #params ~= 1 then
|
||||||
|
return false, WNOA
|
||||||
|
end
|
||||||
|
local p = params[1]
|
||||||
|
if type(p) ~= "number" then
|
||||||
|
return false, UAT
|
||||||
|
end
|
||||||
|
faden.rebirth = minetest.get_gametime() + p
|
||||||
|
faden:stop()
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
|
||||||
|
flush = function(params, faden)
|
||||||
|
return faden:flush(params)
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
return s
|
BIN
textures/pdisc.png
Normal file
BIN
textures/pdisc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 115 B |
Loading…
Reference in New Issue
Block a user