mirror of
https://github.com/Adorable-Catgirl/LuaComp.git
synced 2024-11-23 02:18:06 +11:00
luacomp3 maybe?
This commit is contained in:
parent
798d60dadd
commit
81fdcb064b
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "libpreproc"]
|
||||||
|
path = libpreproc
|
||||||
|
url = git@github.com:lunaboards-dev/libpreproc.git
|
1
libpreproc
Submodule
1
libpreproc
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit af74760d6113fee5e509cc983163f140a674ae07
|
12
luacomp3/init.lua
Normal file
12
luacomp3/init.lua
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
--@[[if false then]]
|
||||||
|
local parser = require("luacomp3.parser")
|
||||||
|
--@[[else]]
|
||||||
|
--#include "parser.lua" "parser"
|
||||||
|
--@[[end]]
|
||||||
|
|
||||||
|
local p = setmetatable({}, {__index=parser})
|
||||||
|
p:init()
|
||||||
|
local f = io.open(arg[1], "rb")
|
||||||
|
local d = f:read("a")
|
||||||
|
f:close()
|
||||||
|
p:parse(d)
|
68
luacomp3/parser.lua
Normal file
68
luacomp3/parser.lua
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
local lpp = require("libpreproc")
|
||||||
|
local p = function(a)return lpp.pattern(a, true)end
|
||||||
|
local parser = {}
|
||||||
|
|
||||||
|
function parser:single_pass()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local span = lpp.block(p"[{", p"}]")
|
||||||
|
local block = lpp.block(p"[[", p"]]")
|
||||||
|
local parens = lpp.block(p"(", p")")
|
||||||
|
local luacode = lpp.pattern("@(%d*)")
|
||||||
|
local shellcode = p"$"
|
||||||
|
local directive = lpp.pattern("--#!*")
|
||||||
|
|
||||||
|
function parser:init()
|
||||||
|
local parse = lpp.instance()
|
||||||
|
|
||||||
|
--Lua code span
|
||||||
|
parse:add_token(lpp.prefix(luacode, span), function(stream, instance, result)
|
||||||
|
if #result.matches == 2 and result.matches[1] and result.matches[1] ~= "" then
|
||||||
|
result.matches.pass = tonumber(result.matches[1], 10)
|
||||||
|
if (result.matches.pass > 0) then
|
||||||
|
instance:emit(string.format("@%d[{%s}]", result.matches.pass, result.matches[2]))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
instance:write(string.format("write(%s)", result.matches[#result.matches]))
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Lua code block
|
||||||
|
parse:add_token(lpp.prefix(luacode, block), function(stream, instance, result)
|
||||||
|
--print("<m>", table.unpack(result.matches))
|
||||||
|
if #result.matches == 2 and result.matches[1] and result.matches[1] ~= "" then
|
||||||
|
result.matches.pass = tonumber(result.matches[1], 10)
|
||||||
|
if (result.matches.pass > 0) then
|
||||||
|
instance:emit(string.format("@%d[[%s]]", result.matches.pass, result.matches[2]))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
instance:write(result.matches[#result.matches])
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Shell variable
|
||||||
|
parse:add_token(lpp.prefix(shellcode, span), function(stream, instance, result)
|
||||||
|
instance:write(string.format("write(os.getenv(%q))", result.matches[1]))
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Shell variable, wrapped in quotes
|
||||||
|
parse:add_token(lpp.prefix(shellcode, parens), function(stream, instance, result)
|
||||||
|
instance:write(string.format("write('\"'..os.getenv(%q)..'\"')", result.matches[1]))
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Shell block
|
||||||
|
parse:add_token(lpp.prefix(shellcode, block), function(stream, instance, matches)
|
||||||
|
|
||||||
|
end)
|
||||||
|
self.parser = parse
|
||||||
|
end
|
||||||
|
|
||||||
|
function parser:parse(code)
|
||||||
|
self.parser:compile(code)
|
||||||
|
print(self.parser.code)
|
||||||
|
local res = self.parser:generate()
|
||||||
|
print(res)
|
||||||
|
end
|
||||||
|
|
||||||
|
return parser
|
Loading…
Reference in New Issue
Block a user