Извлечение переменных из выражения в Lua - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть выражения в lua, который содержит стандартные метатабельные операции .__add,.__sub,.__mul, (+,-,*) Например, a+b*xyz-cde Я пытаюсь извлечь все свободные переменные из таблицы. Для этого выражения таблица будет содержать {a,b,xyz,cde}. Прямо сейчас я пытаюсь сделать это с помощью строковых операций, таких как разбиение, замена et c. Кажется, это работает, но я чувствую это как уродливый способ. Это становится немного сложнее, так как в выражениях могут быть вложенность и скобки. Например, выражение (a+b)-c*xyz*(a+(b+c)) должно возвращать таблицу {a,b,c,xyz}. Может ли быть простой способ извлечь свободные переменные в выражениях? Я даже ищу простой способ с библиотекой строк.

1 Ответ

2 голосов
/ 23 апреля 2020

Если вы хотите выполнить обработку строк, это просто:

local V={}
local s="((a+b)-c*xyz*(a+(b+c)))"
for k in s:gmatch("%a+") do
    V[k]=k
end
for k in pairs(V) do print(k) end

Для развлечения вы можете позволить Lua выполнять тяжелую работу:

local V={}
do
    local _ENV=setmetatable({},{__index=function (t,k) V[k]=k return 0 end})
    local _=((a+b)-c*xyz*(a+(b+c)))
end
for k in pairs(V) do print(k) end

Этот код оценивает выражение в пустой среде, где каждая переменная имеет значение ноль, сохраняя имена переменных в выражении в таблице.

...