2017-02-13 111 views
0

我想解析lua文件中的所有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 

基本上,我想換句話說,函數體everyting函數聲明和之間最後結束。不過,我想出了這個:

(?<=function)(.*?)(?=end) 

感謝您的回答。

+1

這是非常困難的,如果不是不可能的話,因爲正則表達式通常不是遞歸的。 –

+0

如果此語言是基於縮進的,它可能是可行的。如果不是,那麼你必須能夠處理嵌套,即。 _if if else if end end end_ – sln

回答

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 

請注意,您需要一個空行,在你的代碼的頂部找到的第一個功能。

+2

順便說一句,在第一個'function'之前的空白行可以在運行'gmatch'前添加。 –

+0

嗯好吧,但問題是,我不能確定輸出將如何。例如,正好在彼此之下的函數(沒有空的空白行)。我也忘了提到我想要java代碼。 – x84x4

+1

@ x84x4,上面的代碼在函數之間不需要空白,只是它們在第1列開始和結束。 – lhf

0

只要功能定義在第一列中開始和結束,並且只要使用[local] function ...[local] fname = function ...來定義函數,那麼這裏有一些函數將輸出文件的函數體。還有一條用於檢測單線函數定義的規定。

函數func_bodies()是一個迭代器,它返回包含函數體的行的表。如果line未開始函數定義,則is_func_def()函數返回nilshow_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 

Sample inter action:

> show_funcs("test_funcs2.lua") 
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 

Group[3]: 
return x + y; 

Group[4]: 
return x - y; 

Group[5]: 
return x * y; 

Group[6]: 
return x/y; 
+0

@ x84x4--我在我的解決方案中添加了一項改進,以允許檢測本地範圍的功能。 –

+0

好的謝謝,但如果函數聲明在一條線上呢?而且,你的測試功能也非常簡單。這是否適用於幾個如果然後陳述? – x84x4

+0

它可以處理任意複雜的函數,只要定義在第一列中開始和結束,並且中間的行縮進。它適用於您的示例代碼。單線功能可能會作爲特殊情況添加。嵌套函數定義不會那麼簡單。 –