diff --git a/libpreproc/init.lua b/libpreproc/init.lua index bc6891d..6e768a2 100644 --- a/libpreproc/init.lua +++ b/libpreproc/init.lua @@ -34,10 +34,12 @@ function lpp.prefix(prefix, match) return function(str, inst, offset) offset = offset or 0 local positions = table.pack(prefix:find(str)) + --print(prefix.pattern, table.unpack(positions)) if not positions[1] then return end local st, en = table.remove(positions, 1), table.remove(positions, 1) local result = match(str, inst, en+1, en+1) - if not result or result.start ~= en+1 then return end + --print(prefix.pattern, result) + if not result or (result.start ~= en+1 and result.size ~= 0 and en ~= 0) then return end for i=1, #result.matches do table.insert(positions, result.matches[i]) end @@ -56,7 +58,7 @@ function lpp.linestart(match) offset = offset or 0 local result = match(str, inst, offset) if not result then return end - local dat = str:peek(result.start) + local dat = str:peek(offset-1) if dat:sub(#dat, #dat) == "\n" then return result end @@ -117,10 +119,13 @@ end function lpp.inner_prefix(prefix, match) prefix = lpp.pattern(prefix, true) return function(str, inst, offset) + offset = offset or 0 local result = match(str, inst, offset) + --print("inner", prefix.pattern, result) if not result then return end local inner = table.remove(result.matches) local matches = table.pack(inner:find(prefix.pattern, 1, prefix.raw)) + --print("inner", prefix.pattern, table.unpack(matches)) if not matches[1] then return end local st, en = table.remove(matches, 1), table.remove(matches, 1) if en == 0 then diff --git a/libpreproc/parser.lua b/libpreproc/parser.lua index abacd3b..66145d2 100644 --- a/libpreproc/parser.lua +++ b/libpreproc/parser.lua @@ -27,7 +27,8 @@ function parser:compile(code, name) if result then first_match = first_match or result processor = processor or self.tokens[i].process - if first_match.start < result.start then + if first_match.start > result.start then + print(string.format("%d: closer match (%d < %d)", i, result.start, first_match.start)) processor = self.tokens[i].process first_match = result end @@ -45,13 +46,19 @@ function parser:compile(code, name) self:emit(emitting) end self.code = table.concat(self.gencode, " ") - local env = setmetatable({write = function(s) - table.insert(self.output, s) - end}, {__index=function(_, i) - return self.export[i] or self.env[i] or _G[i] - end, __newindex=function(_, k, v) - self.export[k] = v - end}) + local env = setmetatable({ + _INSTANCE = self, + write = function(s) + table.insert(self.output, s) + end + }, { + __index=function(_, i) + return self.export[i] or self.env[i] or _G[i] + end, __newindex=function(_, k, v) + self.export[k] = v + end + }) + --print(self.code) self.gen = assert(load(self.code, (name and "="..name), "t", env)) self.name = name return num_matches diff --git a/tests/lhp.lua b/tests/lhp.lua index 4b1a632..a6a81b7 100644 --- a/tests/lhp.lua +++ b/tests/lhp.lua @@ -6,7 +6,7 @@ local blk = lpp.block("") local eq = lpp.pattern("(=?)") local php = lpp.pattern("(php%s)") local lua = lpp.pattern("lua(=?)%s") -local args = lpp.pattern("args ") +local args = lpp.pattern("args ", true) local whitespace = lpp.pattern("%s*") local php_match = lpp.inner_prefix(php, blk) local args_badmatch = lpp.prefix(whitespace, lpp.inner_prefix(args, blk)) @@ -44,5 +44,5 @@ local dat = f:read("*a") f:close() table.remove(arg, 1) parser:compile(dat) ---print(parser.code) +print(parser.code) print(parser:generate(table.unpack(arg))) \ No newline at end of file diff --git a/tests/lhp/args.lhp b/tests/lhp/args.lhp new file mode 100644 index 0000000..4a96dbf --- /dev/null +++ b/tests/lhp/args.lhp @@ -0,0 +1,2 @@ + +Hello, ! \ No newline at end of file diff --git a/tests/lhp/badargs.lhp b/tests/lhp/badargs.lhp new file mode 100644 index 0000000..9863244 --- /dev/null +++ b/tests/lhp/badargs.lhp @@ -0,0 +1,3 @@ +lol + +test \ No newline at end of file diff --git a/tests/luapreproc.lua b/tests/luapreproc.lua new file mode 100644 index 0000000..7961b27 --- /dev/null +++ b/tests/luapreproc.lua @@ -0,0 +1,36 @@ +-- dry run luapreproc for including files together +local lpp = require("libpreproc") + +local directive_prefix = lpp.pattern("--#", true) +local dblquotes = lpp.block('"', '"') +local include = (lpp.prefix(directive_prefix, lpp.prefix("include ", dblquotes))) + +local parser = lpp.instance() + +parser.env.directives = {} + +local function readfile(file) + local f = assert(io.open(file, "r")) + local dat = f:read("*a") + f:close() + return dat +end + +function parser.env.directives.include(inst, path) + local newinst = inst:clone() + local d = readfile(path) + newinst:compile(d) + local code = newinst:generate() + return code +end + +parser:add_token(include, function(stream, instance, result) + instance:write(string.format("write(directives.include(_INSTANCE, %q))", result.matches[1])) +end) + +local file = arg[1] + +table.remove(arg, 1) +parser:compile(readfile(file)) +print(parser.code) +print(parser:generate(table.unpack(arg))) \ No newline at end of file diff --git a/tests/luapreproc/test1.lua b/tests/luapreproc/test1.lua new file mode 100644 index 0000000..7bb1593 --- /dev/null +++ b/tests/luapreproc/test1.lua @@ -0,0 +1,2 @@ +print("test lol") +print("test lmao even") \ No newline at end of file diff --git a/tests/luapreproc/test2.lua b/tests/luapreproc/test2.lua new file mode 100644 index 0000000..dd2ef1a --- /dev/null +++ b/tests/luapreproc/test2.lua @@ -0,0 +1,3 @@ +print("lol lmao") +--#include "tests/luapreproc/test1.lua" +print("shit here") \ No newline at end of file