Lua 中从表达式中提取变量

我有 Lua 中包含标准元表操作 . __add,. __sub, .__mul,(+,-,*) 的表达式 例如 a+b*xyz-cde 我试图提取表中的所有自由变量。对于这个表达式,表将包含 {a,b,xyz,cde}。现在我正在尝试使用字符串操作,例如拆分,替换等。这似乎可以工作,但我觉得它很丑陋。由于表达式中可能涉及嵌套和括号,所以它会变得有点复杂。例如,表达式 (a+b)-c*xyz*(a+(b+c)) 应返回表 {a,b,c,xyz}。是否可以有一种简单的方法来提取表达式中的自由变量?我甚至在寻找带有字符串库的简单方法。

点赞
用户107090
用户107090

如果你想进行字符串处理,很容易:

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

此代码在一个空环境中评估表达式,其中每个变量都有值零,并将表达式中的变量名称保存在一个表中。

2020-04-23 12:06:14