我想解析lua文件中的所有lua函数声明。例如,我们假设我已经获得了此代码:
function foo(a, b, c)
local d = a + b
local e = b - c
return d *e
end
function boo(person)
if (person.age == 18) then
print("Adult")
else
print("Kid")
end
if (person.money > 20000) then
print("Rich")
else
print("poor")
end
end
我想得到这样的结果:
Group[1]:
local d = a + b
local e = b - c
return d *e
Group[2]:
if (person.age == 18) then
print("Adult")
else
print("Kid")
end
if (person.money > 20000) then
print("Rich")
else
print("poor")
end
基本上,我想在功能声明和最后一端之间使用函数体。但是,我想出了这个:
(?<=function)(.*?)(?=end)
感谢您的回答。
答案 0 :(得分:2)
如果你的所有函数定义都在第1列开始和结束,那么这就可以了:
L=[[
function foo(a, b, c)
local d = a + b
local e = b - c
return d *e
end
function boo(person)
if (person.age == 18) then
print("Adult")
else
print("Kid")
end
if (person.money > 20000) then
print("Rich")
else
print("poor")
end
end
]]
for b in L:gmatch("\nfunction.-\n(.-)\nend") do
print("------------------")
print(b)
end
请注意,代码顶部需要一个空行才能找到第一个函数。
答案 1 :(得分:0)
以下是一些函数将输出文件的函数体,只要函数定义在第一列中开始和结束,并且只要使用[local] function ...
或{{1定义函数}}。还有一项用于检测单行函数定义的规定。
函数[local] fname = function ...
是一个迭代器,它返回包含函数体的行的表。如果func_bodies()
未开始函数定义,is_func_def()
函数将返回nil
。 line
函数使用迭代器并打印结果。请注意,在函数定义之前或之间不需要空行。
show_funcs()
以下是一个示例互动:
function is_func_def (line)
return string.match(line, "^function%s+") or
string.match(line, "^local%s+function%s+") or
string.match(line, "^local%s+[%w_]+%s*=%s*function%s+") or
string.match(line, "^[%w_]+%s*=%s*function%s+")
end
function func_bodies (file)
local body
local in_body = false
local counter = 0
local lines = io.lines(file)
return function ()
for line in lines do
if in_body then
if string.match(line, "^end") then
in_body = false
return counter, body
else
table.insert(body, line)
end
elseif is_func_def(line) then
counter = counter + 1
body = {}
if string.match(line, "end$") then
table.insert(body, string.match(line, "%)%s+(.+)%s+end$"))
return counter, body
else
in_body = true
end
end
end
return nil
end
end
function show_funcs (file)
for i, body in func_bodies(file) do
io.write(string.format("Group[%d]:\n", i))
for k, v in ipairs(body) do
print(v)
end
print()
end
end
以下是用于上述测试的文件:
> show_funcs("test_funcs3.lua")
Group[1]:
local a = 2*x
local b = 2*y
return a + b
Group[2]:
local c = x / 2
local d = y / 2
return c - d
Group[3]:
local a = x + 1
local b = y + 2
return a * b
Group[4]:
local a = x - 1
local b = y - 2
return a / 2 - b / 2
以下是添加了一些单行函数的示例代码:
function f_1 (x, y)
local a = 2*x
local b = 2*y
return a + b
end
local function f_2 (x, y)
local c = x / 2
local d = y / 2
return c - d
end
g_1 = function (x, y)
local a = x + 1
local b = y + 2
return a * b
end
local g_2 = function (x, y)
local a = x - 1
local b = y - 2
return a / 2 - b / 2
end
示例互动:
function foo(a, b, c)
local d = a + b
local e = b - c
return d *e
end
function boo(person)
if (person.age == 18) then
print("Adult")
else
print("Kid")
end
if (person.money > 20000) then
print("Rich")
else
print("poor")
end
end
function f1 (x, y) return x + y; end
local function f2 (x, y) return x - y; end
g1 = function (x, y) return x * y; end
local g2 = function (x, y) return x / y; end