Я пытаюсь реализовать простую функцию C ++, которая проверяет синтаксис сценария Lua. Для этого я использую функцию компилятора Lua luaL_loadbufferx()
и потом проверяю возвращаемое значение.
Недавно я столкнулся с проблемой, потому что код, который, я думал, должен быть помечен как недопустимый, не был обнаружен, и вместо этого скрипт потерпел неудачу позже во время выполнения (например, в 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 (здесь).
Спасибо большое за помощь.