mirror of
https://github.com/Adorable-Catgirl/LuaComp.git
synced 2024-11-23 02:18:06 +11:00
fixed escape related regression
This commit is contained in:
parent
ddd8de4d67
commit
42b2ee6676
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
luacomp.lua
|
||||
luacomp
|
||||
build/*
|
||||
*.out
|
17
src/ast2.lua
17
src/ast2.lua
@ -87,7 +87,7 @@ do
|
||||
function ast.parser_error(str, err)
|
||||
local y, x = str:get_yx()
|
||||
--print(y, x)
|
||||
lc_error(@[{_GENERATOR.fname}], string.format("%s(%d:%d): %s\n", str.file, y or 0, x or 0, err))
|
||||
lc_error("@[{_GENERATOR.fname}]", string.format("%s(%d:%d): %s\n", str.file, y or 0, x or 0, err))
|
||||
end
|
||||
|
||||
function ast.unescape(escaped_string)
|
||||
@ -114,8 +114,9 @@ do
|
||||
function ast.remove_escapes(escaped_string)
|
||||
local i = 1
|
||||
local out_string = ""
|
||||
while i < #escaped_string do
|
||||
while i <= #escaped_string do
|
||||
local c = escaped_string:sub(i,i)
|
||||
--lc_warning(c, tostring(i).." "..#escaped_string)
|
||||
if (c == "\\") then
|
||||
i = i + 1
|
||||
else
|
||||
@ -123,17 +124,19 @@ do
|
||||
end
|
||||
i = i + 1
|
||||
end
|
||||
--lc_warning("debug", out_string)
|
||||
return out_string
|
||||
end
|
||||
|
||||
function ast.back_escape_count(str, start)
|
||||
local i=1
|
||||
local i=2
|
||||
while str:peek(-i):sub(1,1) == "\\" do
|
||||
i = i + 1
|
||||
if (str:tell()-i < start) then
|
||||
ast.error(str, "internal error")
|
||||
end
|
||||
end
|
||||
--lc_warning(tostring(i), #str:peek(1-i).." "..str:peek(1-i))
|
||||
return str:peek(1-i)
|
||||
end
|
||||
|
||||
@ -152,7 +155,7 @@ do
|
||||
end
|
||||
str:set(rpos)
|
||||
if str:peek(-1) == "\\" then
|
||||
local parsed = ast.remove_escapes(ast.back_unescape(str))
|
||||
local parsed = ast.remove_escapes(ast.back_escape_count(str, spos))
|
||||
if parsed:sub(#parsed) == "\'" then
|
||||
goto found_end
|
||||
end
|
||||
@ -183,14 +186,16 @@ do
|
||||
end
|
||||
end
|
||||
str:set(rpos)
|
||||
if str:peek(-1) == "\\" then
|
||||
local parsed = ast.remove_escapes(ast.back_unescape(str))
|
||||
--lc_warning(str:peek(-2), "test")
|
||||
if str:peek(-2):sub(1,1) == "\\" then
|
||||
local parsed = ast.remove_escapes(ast.back_escape_count(str, spos))
|
||||
if parsed:sub(#parsed) == "\"" then
|
||||
goto found_end
|
||||
end
|
||||
else
|
||||
goto found_end
|
||||
end
|
||||
--str:set(rpos)
|
||||
end
|
||||
::found_end::
|
||||
local epos = str:tell()
|
||||
|
@ -46,9 +46,9 @@ do
|
||||
fenv._G = fenv
|
||||
fenv._GENERATOR = env
|
||||
function fenv.call_directive(dname, ...)
|
||||
if not directives[dname] then lc_error(@[{_GENERATOR.fname}], "invalid directive "..dname) end
|
||||
if not directives[dname] then lc_error("@[{_GENERATOR.fname}]", "invalid directive "..dname) end
|
||||
local r, er = directives[dname](env, ...)
|
||||
if not r then lc_error(@[{_GENERATOR.fname}], er) end
|
||||
if not r then lc_error("@[{_GENERATOR.fname}]", er) end
|
||||
end
|
||||
|
||||
function fenv.write_out(code)
|
||||
|
1
tests/bad_include.lua
Normal file
1
tests/bad_include.lua
Normal file
@ -0,0 +1 @@
|
||||
--#include "nonexistant"
|
2
tests/bad_string.lua
Normal file
2
tests/bad_string.lua
Normal file
@ -0,0 +1,2 @@
|
||||
--#include "fuck
|
||||
"
|
1
tests/bad_string_2.lua
Normal file
1
tests/bad_string_2.lua
Normal file
@ -0,0 +1 @@
|
||||
--#include "wtf\"
|
Loading…
Reference in New Issue
Block a user