0

我有一堆 Lua 5.1 文件,里面有这个(或类似的)结构:

...
本地阿尔法,
      测试版
      =功能“伽玛”
      {
        '三角洲',
        'ε'
      }
...

也就是说,对 的调用FUNCTION返回一个函数,该函数返回一些值,这些值分配给一些局部变量,在现场声明。

确切的代码可能会有所不同——无论是在风格上(例如,所有内容都可能在同一行),还是在内容上(例如,可以有零个参数传递给第二个函数调用)。但事情总是以 开始local,并以两个链式函数调用结束。

我有一个电话号码FUNCTION。我需要找到链中最后一个函数调用的结尾(这个特定的函数;FUNCTION文件中的某个位置可能还有更多调用),并从该点向上删除所有文件内容。

即,之前:

打印(“富”)——01
本地 alpha = FUNCTION 'beta' -- 02
{“伽马”}——03
打印(“酒吧”)——04

后:

-- 03
打印(“酒吧”)——04

关于如何解决这个问题的任何线索?


更新:

为了更清楚地说明为什么天真的正则表达式方法不起作用,一个现实生活中的例子:

本地阿尔法
      = FUNCTION ( -- 我的行号点在这里
          功能“测试版”{“伽玛”}()
            和“ε”
             或“泽塔”
        )
      {
        '埃塔'
      } -- 结果应该从这里和上面切掉
4

1 回答 1

1

主要思想:搜索相邻的山雀()()

local line_no = 12
local str = [[
print("foo")
local nif_nif
      = FUNCTION (
          FUNCTION 'beta' { 'gamma' } ()
            and 'epsilon'
             or 'zeta'
        )
      {
        'eta'
      }
local nuf_nuf
      = FUNCTION (      -- this is line#12
          FUNCTION 'beta' { 'gamma' } ()
            and 'epsilon'
             or 'zeta'
        )
      {
        'eta'
      }                 -- should be cut from here
local naf_naf
      = FUNCTION (
          FUNCTION 'beta' { 'gamma' } ()
            and 'epsilon'
             or 'zeta'
        )
      {
        'eta'
      }
print("bar")
]]

-- cut all text before target "local" keyword
str = str:gsub('\n','\0',line_no):gsub('^.*(local.-%z)','%1'):gsub('%z','\n')

-- enclose string literals and table constructors into temporary parentheses
str = str:gsub('%b""','(\0%0\0)')
         :gsub("%b''",'(\0%0\0)')
         :gsub("%b{}",'(\0%0\0)')

-- replace text in parentheses with links to it
local n, t = 0, {}
str = str:gsub('%b()', function(s) n=n+1 t[n..'']=s return'<\0'..n..'>' end)

-- search for first chained function call and cut it out
str = str:gsub('^.-<%z%d+>%s*<%z%d+>', '')
repeat
  local ctr
  str, ctr = str:gsub('^%s*<%z%d+>', '')
until ctr == 0

-- replace links with original text
t, str = nil, str:gsub('<%z(%d+)>', t)

-- remove temporary parentheses
str = str:gsub('%(%z', ''):gsub('%z%)', '')

print(str)

输出:

                 -- should be cut from here
local naf_naf
      = FUNCTION (
          FUNCTION 'beta' { 'gamma' } ()
            and 'epsilon'
             or 'zeta'
        )
      {
        'eta'
      }
print("bar")
于 2013-08-27T19:07:31.190 回答