我正在搞乱Lua试图创建我自己的“脚本语言”。
它实际上只是一个被转换为Lua代码的字符串,然后通过使用loadstring来执行。我的字符串模式有问题。当您分支(例如,在变量声明中定义变量)时,它会出错。例如,以下代码会出错:
local code = [[
define x as private: function()
define y as private: 5;
end;
]]
--defining y inside of another variable declaration, causes error
这种情况正在发生,因为声明变量的模式首先查找关键字“define”,并捕获所有内容,直到找到分号。因此,x将被定义为:
function()
define y as private: 5 --found a semicolon, set x to capture
我想我的问题是,是否可以忽略分号,直到达到正确的分号?到目前为止,这是我的代码:
local lang = {
["define(.-)as(.-):(.-);"] = function(m1, m2, m3)
return (
m2 == "private" and " local " .. m1 .. " = " .. m3 .. " " or
m2 == "global" and " " .. m1 .. " = " .. m3 .. " " or
"ERROR IN DEFINING " .. m1
)
end,
}
function translate(code)
for pattern, replace in pairs(lang) do
code = code:gsub(pattern, replace)
end
return code
end
local code = [[
define y as private: function()
define x as private: 10;
end;
]]
loadstring(translate(code:gsub("%s*", "")))()
--remove the spaces from code, translate it to Lua code through the 'translate' function, then execute it with loadstring
答案 0 :(得分:1)
最简单的解决方案是从
更改上一个捕获组(.-) -- 0 or more lazy repetitions
到
(.*) -- 0 or more repetitions
即
pattern = 'define(.-)as(.-):(.*);'
根据PiL的-
修饰符匹配最短的序列。
但是,正如我的评论中所述,我不建议使用模式匹配为您的语言编写解析器。它要么需要非常复杂的模式(以防止边缘情况),也可能不清楚其他人。