issue #98 fix bug in while parsing - remove extra endscope

pull/168/head
Dibyendu Majumdar 5 years ago
parent 2912415983
commit f9c74b3b08

@ -1,43 +0,0 @@
local str =
[[return function()
local a = 1
local function y()
return function()
return a
end
end
local a = 5
local function z()
return function()
return a
end
end
return y, z
end
]]
local x, msg = ast.parse(str)
if not x then print(msg) end
print(x:tostring())
str =
[[return function (a, b, c, d, e)
if a == b then goto l1
elseif a == c then goto l2
elseif a == d then goto l2
else if a == e then goto l3
else goto l3
end
end
::l1:: ::l2:: ::l3:: ::l4::
end
]]
x, msg = ast.parse(str)
if not x then print(msg) end
print(x:tostring())

@ -125,3 +125,80 @@ function()
end
end
function()
return
function(
a --local symbol ?
)
while
--[binary expr start]
--[primary start]
a --local symbol ?
--[primary end]
<
10
--[binary expr end]
do
--[expression statement start]
--[var list start]
--[primary start]
a --local symbol ?
--[primary end]
= --[var list end]
--[expression list start]
--[binary expr start]
--[primary start]
a --local symbol ?
--[primary end]
+
1
--[binary expr end]
--[expression list end]
--[expression statement end]
end
end
end
function()
return
function(
a --local symbol ?
)
::L2::
if
--[unary expr start]
not
--[primary start]
--[binary expr start]
--[primary start]
a --local symbol ?
--[primary end]
<
10
--[binary expr end]
--[primary end]
--[unary expr end]
then
goto L1
end
--[expression statement start]
--[var list start]
--[primary start]
a --local symbol ?
--[primary end]
= --[var list end]
--[expression list start]
--[binary expr start]
--[primary start]
a --local symbol ?
--[primary end]
+
1
--[binary expr end]
--[expression list end]
--[expression statement end]
goto L2
::L1::
end
end

@ -0,0 +1,55 @@
local function doast(str)
local x, msg = ast.parse(str)
if not x then error(msg) end
print(x:tostring())
end
local str =
[[return function()
local a = 1
local function y()
return function()
return a
end
end
local a = 5
local function z()
return function()
return a
end
end
return y, z
end
]]
doast(str)
str =
[[return function (a, b, c, d, e)
if a == b then goto l1
elseif a == c then goto l2
elseif a == d then goto l2
else if a == e then goto l3
else goto l3
end
end
::l1:: ::l2:: ::l3:: ::l4::
end
]]
doast(str)
str =
[[return function (a) while a < 10 do a = a + 1 end end
]]
doast(str)
-- Note that the while loop above is supposed to ultimately
-- generate same code as below
str=
[[return function (a) ::L2:: if not(a < 10) then goto L1 end; a = a + 1;
goto L2; ::L1:: end
]]
doast(str)

@ -1295,7 +1295,6 @@ static struct ast_node *parse_while_statement(struct parser_state *parser, int l
checknext(ls, TK_DO);
stmt->while_or_repeat_stmt.loop_scope = parse_block(parser, &stmt->while_or_repeat_stmt.loop_statement_list);
check_match(ls, TK_END, TK_WHILE, line);
end_scope(parser);
return stmt;
}

Loading…
Cancel
Save