Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
1

How can I fix this gsub problem?

Asked by 10 years ago

I'm messing around with Lua trying to create my own "scripting language".

It's actually just a string that is translated to Lua code, then executed through the use of loadstring. I'm having a problem with my string patterns. When you branch (for example, defining a variable inside of a variable declaration) it errors. For example, the following code would error:

local code = [[
    define x as private: function()
        define y as private: 5;
    end;
]]
--defining y inside of another variable declaration, causes error

This is happening because the pattern to declare a variable first looks for the keyword 'define', and captures everything until a semicolon is found. Therefore, x would be defined as:

function()
    define y as private: 5 --found a semicolon, set x to capture

I guess my question is, is it possible to ignore semicolons until the correct one is reached? Here is my code so far:

local lang = {
    ["define(.-)as(.-):(.-);"] = function(m1, m2, m3) 
        return (
            m2 == "private" and " local " .. m1 .. " = " .. m3 .. " " or 
            " " .. m1 .. " = " .. m3 .. " "
        )
    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 answer

Log in to vote
0
Answered by
adark 5487 Badge of Merit Moderation Voter Community Moderator
10 years ago

You're absolutely crazy for trying to do this at all.

Try to have it only capture as far as the colon when define is caught, incrementing a 'depth' variable, and parsing the remaining code. When it runs into another define or anything else that has a code block ending with a semicolon, catch the "required" portion of that block (i.e. up to the colon in your define), incrementing the 'depth', and parsing the remaining code again.

When it runs into a semicolon at all, decrement the depth value, and return.

Again, you're absolutely crazy for trying this.

Ad

Answer this question