从 Lua 中的表达式中提取变量

Extracting variables from expression in Lua

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

如果你想做字符串处理,很简单:

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

此代码在空环境中计算表达式,其中每个变量的值为零,将表达式中变量的名称保存在 table.