forked from mtcontrib/pdisc
b3ce57c5b4
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
88 lines
1.5 KiB
Lua
88 lines
1.5 KiB
Lua
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
|