Lua 源代码转换:根据近似位置剥离函数调用
2013-8-27 18:54:23
收藏:0
阅读:107
评论:1
我有一堆 Lua 5.1 文件,里面有这样(或类似)的结构:
...
local alpha,
beta
= FUNCTION "gamma"
{
'delta',
'epsilon'
}
...
也就是调用返回函数返回一些值的FUNCTION,这些值被分配给在该处声明的一些本地变量。
精确代码可能会有所不同,无论是风格(比如说,所有东西可能在同一行上),还是内容(比如第二次函数调用可能不传递任何参数)。但总是以“local”开始,并以两个链接的函数调用结束。
我有一个FUNCTION调用的行号。我需要找到最后一个函数调用在链中的结束(这个特别的,可能会在文件的更远的位置有更多的FUNCTION调用),并删除从那一点开始的所有文件内容。
也就是说,在:
print("foo") -- 01
local alpha = FUNCTION 'beta' -- 02
{ "gamma" } -- 03
print("bar") -- 04
之前:
print("foo") -- 01
local alpha = FUNCTION 'beta' -- 02
{ "gamma" } -- 03
print("bar") -- 04
之后:
-- 03
print("bar") -- 04
有什么线索可以解决这个问题吗?
更新:
为了更清楚为什么简单的正则表达式方法行不通,以下是一个真实的例子:
local alpha
= FUNCTION ( -- 我的行号指向这里
FUNCTION 'beta' { 'gamma' } ()
and 'epsilon'
or 'zeta'
)
{
'eta'
} -- 结果应该被从这里和以上截掉
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
主要思路:搜索相邻的括号
()()!local line_no = 12 local str = [[ print("foo") local nif_nif = FUNCTION ( FUNCTION 'beta' { 'gamma' } () and 'epsilon' or 'zeta' ) { 'eta' } local nuf_nuf = FUNCTION ( -- 这是第12行 FUNCTION 'beta' { 'gamma' } () and 'epsilon' or 'zeta' ) { 'eta' } -- 从这里开始应该被剪掉 local naf_naf = FUNCTION ( FUNCTION 'beta' { 'gamma' } () and 'epsilon' or 'zeta' ) { 'eta' } print("bar") ]] -- 剪掉目标 "local" 关键字之前的所有文本 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)输出:
-- 从这里开始应该被剪掉 local naf_naf = FUNCTION ( FUNCTION 'beta' { 'gamma' } () and 'epsilon' or 'zeta' ) { 'eta' } print("bar")