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

时间:2014-10-03 18:14:35

标签: string lua gsub

我正在搞乱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

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是从

更改上一个捕获组
(.-) -- 0 or more lazy repetitions

(.*) -- 0 or more repetitions

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

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

但是,正如我的评论中所述,我不建议使用模式匹配为您的语言编写解析器。它要么需要非常复杂的模式(以防止边缘情况),也可能不清楚其他人。