Lua синтаксическая ошибка: неожиданный символ рядом, 'end' ожидается (FiveM)

Ресурс FiveM не работает с ошибкой синтаксиса Lua? Что означают 'unexpected symbol near', 'end expected' и 'unfinished string', как найти строку и проверить ваш код.

Когда ресурс загружается и один из его файлов не может быть распарсен, консоль печатает что-то вроде этого:

text
Error parsing script @my_script/server/main.lua in resource my_script: @my_script/server/main.lua:48: unexpected symbol near '<'

Это ошибка синтаксиса: файл не является действительным Lua, поэтому ничего в нём не работает. Это отличается от ошибки во время выполнения, такой как attempt to call a nil value, которая происходит, пока код выполняется. Вот что означают обычные сообщения и как найти строку.

Прочитайте сообщение

Каждая ошибка синтаксиса имеет одинаковые части:

text
@my_script/server/main.lua:48: unexpected symbol near '<'
  • @my_script/server/main.lua — это файл, внутри ресурса.
  • 48 — это строка, на которой парсер сдался. Реальная ошибка часто находится на этой строке или выше.
  • near '<' — это токен, который парсер читал, когда не удалось. Ищите его в файле.

Для общего способа чтения ошибок консоли см. как прочитать ошибку скрипта FiveM.

unexpected symbol near

Парсер нашёл что-то, что не может начать или продолжить выражение. Обычные причины:

  • Файл не является Lua. Если он говорит near '<', вы можете сохранить страницу HTML вместо исходного файла, например с веб-сайта размещения кода. Откройте файл и проверьте его первые строки.
  • Маркеры конфликта слияния, такие как <<<<<<< и >>>>>>>, оставленные после объединения двух версий.
  • Заблудившийся символ из копирования кода из чата или веб-страницы: фигурная кавычка, странный пробел, оставшаяся скобка.
  • Код из другого языка, такой как != вместо ~=, или && вместо and.
lua
-- wrong
if price != 0 then end

-- right
if price ~= 0 then end

Совет: Lua FiveM принимает несколько дополнений к стандартному Lua, например составное присваивание, такое как count += 1. Обычный linter Lua может всё ещё их флагировать. Если ваш редактор жалуется на строку, которая работает на сервере, это обычно почему.

'end' expected

text
@my_script/client/main.lua:130: 'end' expected (to close 'function' at line 12) near <eof>

Блок (function, if, for, while, do) был открыт и никогда не закрыт. Lua узнаёт это только при достижении конца файла, что является <eof> в конце сообщения.

Часть в скобках — полезная: она называет блок и строку, где он начался. Перейдите к строке 12 и следуйте этому блоку вниз до тех пор, пока не найдёте, где отсутствует end. Выравнивание отступа делает это очевидным:

lua
function OpenShop(id)            -- line 12
    if Config.Shops[id] then
        ShowMenu(id)
    -- the 'end' for this 'if' is missing
end                              -- this one closes the 'if', so the function is never closed

Противоположная ошибка также существует: один end слишком много даёт '<eof>' expected near 'end'.

Та же логика применяется к скобкам. '}' expected (to close '{' at line 20) означает, что таблица не была закрыта, и ')' expected near означает, что вызов или условие отсутствует его закрывающая скобка. Отсутствующая запятая между двумя записями таблицы производит такое же сообщение:

lua
Config.Shops = {
    { name = 'Bar', price = 10 }    -- missing comma
    { name = 'Cafe', price = 12 },
}

'=' expected near

text
@my_script/shared/config.lua:9: '=' expected near ''bar''

Парсер ожидал присваивания и нашёл значение вместо этого. Частый случай — запись таблицы с ключом, но без =:

lua
Config.Prices = {
    ['burger'] 10,      -- wrong: missing =
    ['water'] = 5,
}

Строка, которая только имя или значение, такая как Config.Debug true, обычно даёт syntax error near вместо этого. Исправление одинаково: найдите, что отсутствует или неправильно напечатано на этой строке.

unfinished string

text
@my_script/client/main.lua:33: unfinished string near '"You need '

Строка была открыта с кавычкой и строка закончилась перед её закрытием. Типичные причины — отсутствующая закрывающая кавычка или апостроф внутри строки в одинарных кавычках:

lua
-- wrong: the apostrophe ends the string
local msg = 'You can't do that'

-- right
local msg = "You can't do that"
local msg2 = 'You can\'t do that'

Для текста, который охватывает несколько строк, используйте длинную строку, так как обычная строка не может содержать разрыв строки:

lua
local help = [[
Line one
Line two
]]

Найти строку быстрее

Не читайте весь файл. Откройте файл на указанной строке, затем:

  1. Посмотрите на саму строку и строку выше.
  2. Если сообщение упоминает строку в скобках, начните с этой строки.
  3. Прокомментируйте половину файла, затем перезагрузитесь. Остаётся ли ошибка, говорит вам, какая половина имеет ошибку.

Лучшая привычка — ловить их до перезагрузки сервера. Установите редактор с поддержкой Lua, такой как VS Code с расширением языкового сервера Lua, и установите его версию Lua на 5.4, чтобы соответствовать FiveM. Это подчёркивает незакрытые блоки и отсутствующие скобки при вводе. Руководство настройки находится в setting up VS Code for FiveM.

Если у вас установлены стандартные инструменты Lua, luac -p file.lua проверяет синтаксис файла без его запуска.

Чеклист

Симптом Исправление
unexpected symbol near '<' Файл это HTML или имеет маркеры конфликта слияния; получите исходный файл снова
unexpected symbol near странный символ Вставленная фигурная кавычка или странный символ; переведите строку
'end' expected (to close 'function' at line N) near <eof> Перейдите к строке N и найдите блок, отсутствующий его end
'<eof>' expected near 'end' Один end слишком много; проверьте отступ выше него
'=' expected near Ключ таблицы без = или отсутствующая запятая перед ним
unfinished string near Отсутствующая закрывающая кавычка или апостроф внутри строки
!= или && в коде Используйте ~= и and

Короткие ответы

Что означает 'unexpected symbol near' в Lua?

Парсер Lua нашёл символ или слово, где оно не может идти. Текст после near — это точный токен, на котором он остановился. Реальная ошибка находится на этой строке или на строке выше.

Почему 'end expected' указывает на другую строку, чем ошибка?

Lua замечает отсутствующий end только при достижении конца файла. Часть в скобках, такая как to close 'function' at line 12, говорит вам, какой блок никогда не был закрыт.

Почему скрипт не загружается с ошибкой синтаксиса, но никогда не достигает runtime?

Ошибка синтаксиса останавливает весь файл от парсинга, поэтому никакой его код не работает. Исправьте ошибку и ресурс загрузится снова.

Скрипты без этой проблемы

Quest CreatorВизуальный редактор квестов и диалогов с NPC — узел за узлом прямо в игре.Смотреть скрипт →Item Creator V2Создавайте используемые предметы с анимациями, пропами, эффектами и не только — без кода.Смотреть скрипт →Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →

Читайте также