有可能修复这个gsub模式吗?

我正在尝试使用Lua创建自己的“脚本语言”。

实际上,它只是一个被翻译成Lua代码的字符串,然后通过使用loadstring执行。我遇到了我的字符串模式的问题。当你分支(例如,在变量声明中定义一个变量)时,它会出错。例如,以下代码会引发错误:

local code = [[
    define x as private: function()
        define y as private: 5;
    end;
]]
--在另一个变量声明的内部定义y会导致错误

这是因为变量的声明模式首先查找关键字“define”,并捕获直到找到分号为止的所有内容。因此,x将被定义为:

function()
    define y as private: 5 --找到分号,设置x的捕获

我想问的问题是,是否可以忽略分号,直到找到正确的分号为止?这是我的代码:

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*", "")))()
--从代码中删除空格,通过'translate'函数将其翻译为Lua代码,然后使用loadstring执行它
点赞
用户868247
用户868247

最简单的解决方法是将最后一个捕获组从

(.-) -- 0或多个懒惰重复

改为

(.*) -- 0或多个重复

pattern ='define(.-)as(.-):(.*);'

根据PiL-修饰符匹配最短序列。

然而,正如我的评论所述,我不建议使用模式匹配编写语言解析器。这将需要非常复杂的模式(以防止边缘情况),并且可能不清楚给他人。

2014-10-03 19:11:57