2

我想gsub在 lua 中使用这样的转换表达式:

MACRO(part1, part2)

在这:

part1SOMETHINGpart2

SOMETHING取决于part1part2。_

所以我可以使用类似的东西:

line = (string.gsub(line, "MACRO%((.-), *(.-)%)", "%1SOMETHING%2"))

并乘以对捕获的两个部分设置一些条件的行,以处理不同的情况。

问题是 part1 或 part2 可以包含宏:

MACRO(MACRO(a,b),c)

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

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

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

4

1 回答 1

1

您需要进行所有替换:

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

然而,这是一个 hack,因为尽管看起来,它并没有以正确的顺序扩展宏,因为它并没有真正正确地识别宏调用和参数。

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

a="A"; b="B"; c="C"
function MACRO(a,b) return "["..a..","..b.."]" end
line=[[
MACRO(MACRO(a,b),c)
]]
print(load("return "..line)())

当然,MACRO根据需要定义。

于 2013-09-18T14:02:54.703 回答