我正在尝试实现一个简单的 C++ 函数,它检查 Lua 脚本的语法。为此,我使用 Lua 的编译器函数luaL_loadbufferx()
并在之后检查它的返回值。
最近,我遇到了一个问题,因为我认为应该标记为 invalid的代码没有被检测到,而是脚本稍后在运行时失败(例如 in lua_pcall()
)。
示例 Lua 代码(可以在官方 Lua 演示中测试):
function myfunc()
return "everyone"
end
-- Examples of unexpected behaviour:
-- The following lines pass the compile time check without errors.
print("Hello " .. myfunc() "!") -- Runtime error: attempt to call a string value
print("Hello " .. myfunc() {1,2,3}) -- Runtime error: attempt to call a string value
-- Other examples:
-- The following lines contain examples of invalid syntax, which IS detected by compiler.
print("Hello " myfunc() .. "!") -- Compile error: ')' expected near 'myfunc'
print("Hello " .. myfunc() 5) -- Compile error: ')' expected near '5'
print("Hello " .. myfunc() .. ) -- Compile error: unexpected symbol near ')'
目标显然是在编译时捕获所有语法错误。所以我的问题是:
- 调用字符串值究竟是什么意思?
- 为什么首先允许这种语法?是我不知道的一些 Lua 功能,还是
luaL_loadbufferx()
这个特定示例中的错误? - 是否可以通过任何其他方法检测此类错误而不运行它?不幸的是,我的函数在编译时无法访问全局变量,所以我不能直接通过
lua_pcall()
.
注意:我使用的是 Lua 版本 5.3.4(此处为手册)。
非常感谢您的帮助。