如何在Lua中捕获平衡字符串匹配中的表达式

我想在lua中使用 gsub 将表达式转换为以下样式:

MACRO(part1,part2)

变为:

part1SOMETHINGpart2

SOMETHING 取决于 part1part2

所以我可以使用以下内容:

line =(string.gsub(line,“MACRO%((。-),*(。-)%)”,“%1SOMETHING%2”))

并且通过将行乘以一些条件来处理捕获的两个部分,以处理不同的情况。

问题在于 part1part2 可以包含宏:

MACRO(MACRO(a,b),c)

所以上面的表达式不会匹配正确的括号...

我知道在lua中有一种匹配平衡括号的可能性 %b(),但据我所知,我们不能在内部放置条件,并且不能像我上面所做的那样使用捕获。

您知道实现我想做的事情的方法吗?

点赞
用户107090
用户107090

你需要进行所有的替换:

local oldline,line
line = [[
MACRO(MACRO(a,b),c)
]]
repeat
    oldline,line = line,line:gsub(“ MACRO%((.-), *(.-)%)”,“%1SOMETHING%2”)
直到 oldline == line
print(line)

然而,这是一个 hack,因为尽管外表上看起来能正确展开宏,但它实际上并没有正确地识别宏调用和参数,所以无法按正确的顺序展开。

由于 line 中的表达式是有效的 Lua 代码,因此可以尝试以下这个解决方案,它将按预期执行,因为 Lua 解析器将完成所有艰苦的工作:

a =“A”; b =“B”; c =“C”
function MACRO(a,b)返回“ [”..a..“,”..b..“]”结束
line = [[
MACRO(MACRO(a,b),c)
]]
print(load(“返回”..line)())

当然,根据需要定义 MACRO

2013-09-18 14:02:54