Función analizadora de código [Actualizado]

Todas los scripts relacionados con AMS.
En inglés se diría "parser function", pero X . Tras ver la necesidad de un usuario de querer obtener las funciones y variables de un script fue que decidí hacer esta función (la cual creo aún se puede mejorar mucho). Al ejecutarla, extraera 2 tablas conteniendo los nombres de las funciones y de las variables que hay en el script sometido por el usuario.

Use mi función de imprimir tabla para mostrar los resultados. Sin más, aca la función en un ejemplo:
function ptbl(tbl, b, c)
    local s = b or " ";
    local ss = c or "";
    local log = ss.."table "..s.."={\r\n";
    if type(tbl) == "table" then
        for row, value in pairs(tbl) do
            local k = type(value);
            if k == "table" then
                log = log..ss..ptbl(value, "["..row.."]", ss.."\t");
            else
                log = log..ss..k..": ["..row.."] = \""..tostring(value).."\",\r\n"
            end
        end
        return log..ss.."}\r\n";
    else
        return "["..type(tbl).."] = "..tostring(tbl);
    end
end

function ParseScript(s)
    local tFs = {};
    local tVars = {};
    for key in string.gmatch(s, "function ([%w%._]+)") do
        table.insert(tFs, #tFs+1, key)
    end
    for key in string.gmatch(s, "(%w+%.%w+) = function") do
        table.insert(tFs, #tFs+1, key)
    end
    for key in string.gmatch(s, "([%w_%.%[%]]-[^=~%(%)])%s=.[^func]") do
    	if key ~= "]" then
        	table.insert(tVars, #tVars+1, key)
        end
    end
    for key in string.gmatch(s, "([%w_%.%[%]]+[^=~%(%)%s])=.[^func]") do
        table.insert(tVars, #tVars+1, key)
    end
    return tFs, tVars;
end
local script = [["local myvar1 = \"something\"
myvar2 = 12345

function MyFunction1(asd,efg)
end

local web=1

local bytes = (x<n) and size or (x==n) and (r~=0) and r or size;

function MyGroupX.MyfunctionX(asd)
    local myVar_Infunc = "something"
end

MyGroupY.MyfunctionY = function (asd)
                            myGlobalVar_Infunc = \"something\"
                        end]];

local a, b = ParseScript(script);
Dialog.Message("", ptbl(a, "Functions"));
Dialog.Message("", ptbl(b, "Vars"));
PD: Actualizaré este post cada que mejore la función, para evitar leer y leer páginas. La info siempre actualizada en el primer post.
Estupendo ;)
me la pela!!!
xD
Jajajajaja, ya sabes ;)
estupendo!
hmmm, no seria mas facil cargar el programa en memoria y hacer un foreach del table _G (u otro secundario) simplemente con un foreach y obteniendo el tipo con type(_G[1...1000])="function"/"string"...

Yo simplemente tendria por ahi un boton o algo y con el setscript pondria algo asi como
_B={}
setfenv(1, _B)
...CODIGO AQUI
setfenv(1, _G)

Luego puedes hacer foreach para _B, no es muy purista de lua pero dara el pego
Es para analizar scripts externos, es decir, no incluídos en el programa en ejecución ;)

:ohyeah: