String 从Lua中的表达式中提取变量
我有lua中的表达式,其中包含标准的元表操作String 从Lua中的表达式中提取变量,string,lua,lua-table,evaluate,String,Lua,Lua Table,Evaluate,我有lua中的表达式,其中包含标准的元表操作。\uuuu-add、.uuuu-sub、.uuu-mul、(+,-,*) 例如a+b*xyz cde我试图提取表中的所有自由变量。对于这个表达式,表将包含{a,b,xyz,cde}。现在我正在尝试使用字符串操作,如拆分、替换等。这似乎有效,但我觉得这是一种丑陋的方式。因为表达式中可能涉及嵌套和括号,所以它不会变得复杂。例如,表达式(a+b)-c*xyz*(a+(b+c))应该返回表{a,b,c,xyz}。有没有一种简单的方法可以提取表达式中的自由变量
。\uuuu-add、.uuuu-sub、.uuu-mul、(+,-,*)
例如
a+b*xyz cde
我试图提取表中的所有自由变量。对于这个表达式,表将包含{a,b,xyz,cde}
。现在我正在尝试使用字符串操作,如拆分、替换等。这似乎有效,但我觉得这是一种丑陋的方式。因为表达式中可能涉及嵌套和括号,所以它不会变得复杂。例如,表达式(a+b)-c*xyz*(a+(b+c))
应该返回表{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
此代码在空环境中对表达式求值,其中每个变量的值都为零,并将表达式中变量的名称保存在表中。听起来您这样做是正确的。如果您包含当前用于执行此操作的代码,我们可能会说您可以如何改进它。您为什么要这样做?