我正在开发一个允许用户输入Lua的脚本(特别是布尔条件),我正在尝试提供一个功能,它将对输入的脚本执行快速错误检查。
如果loadstring()
失败,很容易抛出错误,因此很容易处理语法问题。
但是,如果输入的变量不正确,则很难发现问题。
让我们说用户输入以下内容:
value.custom_value_1 == 1 and valse.custom_value_2 ~= 1
就语法而言,loadstring()
非常满意 - 它会添加' return'作为该字符串的前缀。
我的下一步是在执行用户输入的内容时检查错误。问题是,当value.custom_value_1 ~= 1
时,逻辑会因为我们处理and
而短路 - 我们没有必要继续前进,我们左边已经有了错误 - 手边。
我想要的是找到一种方法让Lua完全评估表达式,而不是短路。如果这样做,则会捕获拼写错误valse
(无论value.custom_value_1
的值如何),并且我可以向最终用户提供错误消息。
有什么想法吗?
我目前最好的想法是过滤用户输入,整理出输入的每个值(基本上,不是条件or
,and
,......)手动完成。但我认为值得检查是否有更好的方法。
答案 0 :(得分:1)
防止短路评估不是您想要/可以做的事情。这就是它的工作方式。
你可以做的是:
if(logic1 and logic2)
{
// code on success
}
else
// check what kind of error we have
{
if(~logic1)
{
// throw error type 1
}
if(~logic2)
{
// throw error type 2
}
}
答案 1 :(得分:1)
如果您不介意预先解析字符串,可以使用像https://github.com/stravant/LuaMinify/blob/master/ParseLua.lua这样的库将源解析为AST,将短路注释修改为函数调用,如
function my_and(x, y)
return x and y
end
然后编译此AST以检查错误。
虽然只是为了捕捉琐碎的错误,但似乎很麻烦。
答案 2 :(得分:0)
我不确定是否有人的答案是准确的,但字面上的问题是“你能否防止短路事故的发生?”我无法找到办法做到这一点。
我最终切断了用户输入并单独测试了每个组件,收集了这些错误并将它们反馈给用户。好像现在好了。