Compare commits
18 Commits
5634fcf4a4
...
level_pars
Author | SHA1 | Date | |
---|---|---|---|
b91ebeb775
|
|||
ab687f8f6d
|
|||
bef95df6a1
|
|||
24435a3c15
|
|||
0c3a36f1fd
|
|||
a39c419e5f
|
|||
9ef762268f
|
|||
e50f516b11
|
|||
f9e28fa0e2
|
|||
38a054dec1
|
|||
fd391ff3bc
|
|||
fbd9f97429
|
|||
2a61e8b5d6
|
|||
4ccbe1dc35
|
|||
b536d2c987
|
|||
62fe5f51d3
|
|||
fd68ef88ec
|
|||
fd9866e963
|
61
the_parser.p8
Normal file
61
the_parser.p8
Normal file
@ -0,0 +1,61 @@
|
||||
pico-8 cartridge // http://www.pico-8.com
|
||||
version 41
|
||||
__lua__
|
||||
-- the parser
|
||||
|
||||
parser = {}
|
||||
mknew(parser)
|
||||
|
||||
-- calls parse_into with a nop
|
||||
-- emit function.
|
||||
function parser:parse(str)
|
||||
self:parse_into(str, function() end)
|
||||
end
|
||||
|
||||
-- read a file of commands and
|
||||
-- execute them, emitting the
|
||||
-- results from each call into
|
||||
-- `emit` as a table per row.
|
||||
--
|
||||
-- a "command" is a method on
|
||||
-- self. a row alternates
|
||||
-- commands with args. when
|
||||
-- calling a command, it also
|
||||
-- gets a table of previous
|
||||
-- results as the first arg.
|
||||
-- args are split on ','.
|
||||
function parser:parse_into(str, emit)
|
||||
for row in all(split(str, "\n")) do
|
||||
local prev = {}
|
||||
local sectors = split(row, ":")
|
||||
for i=1,#sectors,2 do
|
||||
local x = self[sectors[i]](self, prev, usplit(sectors[i+1]))
|
||||
if (x) add(prev, x)
|
||||
end
|
||||
emit(prev)
|
||||
end
|
||||
end
|
||||
|
||||
-- saves prev[sel] as self.name.
|
||||
-- if sel is unspecified, saves
|
||||
-- all of prev (as a table).
|
||||
function parser:saveas(prev, name, sel)
|
||||
self[name] = sel and prev[sel] or prev
|
||||
end
|
||||
|
||||
-- returns its args, ignoring
|
||||
-- prev. Used to stuff things
|
||||
-- into prev. args are packed
|
||||
-- if there's multiple.
|
||||
function parser:val(_, ...)
|
||||
local ret := pack(...)
|
||||
if (#ret == 1) return ret[1]
|
||||
return ret
|
||||
end
|
||||
|
||||
function parser:bind(_, fn, ...)
|
||||
local f = self[fn]
|
||||
return function()
|
||||
f(...)
|
||||
end
|
||||
end
|
1080
updatedshmup.p8
1080
updatedshmup.p8
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user