我想在lua中使用gsub
来转换表达式,如下所示:
MACRO(part1, part2)
在此:
part1SOMETHINGpart2
SOMETHING
取决于part1
和part2
。
所以我可以使用类似的东西:
line = (string.gsub(line, "MACRO%((.-), *(.-)%)", "%1SOMETHING%2"))
并将该线相乘以在捕获的两个部分上设置一些条件,以处理不同的情况。
问题是part1或part2可以包含宏:
MACRO(MACRO(a,b),c)
所以上面的表达式与良好的括号不匹配......
我知道在lua中有可能将平衡的括号与%b()匹配,但据我所知,我们不能在内部放置条件,我们不能像上面那样使用捕获。
你知道如何实现我想做的事吗?
答案 0 :(得分:1)
您需要进行所有替换:
local oldline,line
line=[[
MACRO(MACRO(a,b),c)
]]
repeat
oldline,line=line,line:gsub("MACRO%((.-), *(.-)%)", "%1SOMETHING%2")
until oldline==line
print(line)
然而,这是一个黑客攻击,因为尽管有外观,它不会以正确的顺序扩展宏,因为它没有真正正确地识别宏调用和参数。
由于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
。