Erro de sintaxe Lua: símbolo inesperado perto, 'end' esperado (FiveM)
Recurso FiveM falhando com um erro de sintaxe Lua? O que 'unexpected symbol near', 'end expected' e 'unfinished string' significam, como encontrar a linha e lintar seu código.
Quando um recurso carrega e um de seus arquivos não consegue ser analisado, o console imprime algo como isto:
Error parsing script @my_script/server/main.lua in resource my_script: @my_script/server/main.lua:48: unexpected symbol near '<'Este é um erro de sintaxe: o arquivo não é Lua válido, portanto nada nele é executado. É diferente de um erro de tempo de execução como tentar chamar um valor nil, que acontece enquanto o código está em execução. Aqui está o que as mensagens comuns significam e como encontrar a linha.
Leia a mensagem
Cada erro de sintaxe tem as mesmas partes:
@my_script/server/main.lua:48: unexpected symbol near '<'@my_script/server/main.luaé o arquivo, dentro do recurso.48é a linha onde o analisador desistiu. O erro real é frequentemente nessa linha ou na linha acima.near '<'é o token que o analisador estava lendo quando falhou. Procure por ele no arquivo.
Para a forma geral de ler erros de console, veja como ler um erro de script FiveM.
símbolo inesperado perto
O analisador encontrou algo que não consegue iniciar ou continuar uma declaração. As causas usuais:
- O arquivo não é Lua. Se diz
near '<', você pode ter salvado uma página HTML em vez do arquivo bruto, por exemplo de um site de hospedagem de código. Abra o arquivo e verifique suas primeiras linhas. - Marcadores de conflito de fusão como
<<<<<<<e>>>>>>>deixados para trás após combinar duas versões. - Um caractere desgarrado ao copiar código de um bate-papo ou página web: uma aspas curva, um espaço estranho, um colchete restante.
- Código de outra linguagem, como
!=em vez de~=, ou&&em vez deand.
-- wrong
if price != 0 then end
-- right
if price ~= 0 then endDica: Lua do FiveM aceita alguns adições ao Lua padrão, por exemplo atribuição composta como
count += 1. Um simples linter Lua ainda pode sinalizá-las. Se seu editor reclama de uma linha que funciona no servidor, esse é geralmente o motivo.
'end' esperado
@my_script/client/main.lua:130: 'end' expected (to close 'function' at line 12) near <eof>Um bloco (function, if, for, while, do) foi aberto e nunca fechado. Lua só descobre quando chega ao fim do arquivo, que é o <eof> no fim da mensagem.
A parte entre colchetes é a útil: nomeia o bloco e a linha onde ele começou. Vá para a linha 12 e siga esse bloco para baixo até encontrar um end faltando. Alinhar a indentação torna óbvio:
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 closedO erro oposto existe também: um end demais dá '<eof>' expected near 'end'.
A mesma lógica se aplica a colchetes. '}' expected (to close '{' at line 20) significa uma tabela não foi fechada, e ')' expected near significa uma chamada ou condição está faltando seu colchete de fechamento. Uma vírgula faltando entre duas entradas de tabela produz o mesmo tipo de mensagem:
Config.Shops = {
{ name = 'Bar', price = 10 } -- missing comma
{ name = 'Cafe', price = 12 },
}'=' esperado perto
@my_script/shared/config.lua:9: '=' expected near ''bar''O analisador esperava uma atribuição e encontrou um valor em vez disso. Um caso frequente é uma entrada de tabela com uma chave mas sem =:
Config.Prices = {
['burger'] 10, -- wrong: missing =
['water'] = 5,
}Uma linha que é apenas um nome ou um valor, como Config.Debug true, geralmente dá syntax error near em vez disso. A correção é a mesma: encontre o que está faltando ou digitado incorretamente naquela linha.
string inacabada
@my_script/client/main.lua:33: unfinished string near '"You need 'Uma string foi aberta com uma aspas e a linha terminou antes de ser fechada. As causas típicas são uma aspas de fechamento faltando, ou um apóstrofo dentro de uma string entre aspas simples:
-- 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'Para texto que abrange várias linhas, use uma string longa, já que uma string normal não consegue conter uma quebra de linha:
local help = [[
Line one
Line two
]]Encontre a linha mais rápido
Não leia o arquivo inteiro. Abra o arquivo na linha relatada, depois:
- Procure a linha em si e a linha acima.
- Se a mensagem mencionar uma linha entre colchetes, comece dessa linha em vez disso.
- Comente metade do arquivo, depois recarregue. Se o erro permanece diz qual metade tem o erro.
Um hábito melhor é pegar esses antes de reiniciar o servidor. Instale um editor com suporte Lua, como VS Code com uma extensão de servidor de linguagem Lua, e defina sua versão Lua para 5.4 para corresponder ao FiveM. Ele sublinha blocos não fechados e colchetes faltando conforme você digita. Um guia de configuração está em configuração VS Code para FiveM.
Se você tem as ferramentas Lua padrão instaladas, luac -p file.lua verifica a sintaxe de um arquivo sem executá-lo.
Checklist
| Sintoma | Correção |
|---|---|
unexpected symbol near '<' |
O arquivo é HTML ou tem marcadores de conflito de fusão; obtenha o arquivo bruto novamente |
unexpected symbol near um caractere estranho |
Uma aspas curva ou caractere estranho colado; retype a linha |
'end' expected (to close 'function' at line N) near <eof> |
Vá para a linha N e encontre o bloco faltando seu end |
'<eof>' expected near 'end' |
Um end demais; verifique a indentação acima dele |
'=' expected near |
Uma chave de tabela sem =, ou uma vírgula faltando antes dela |
unfinished string near |
Uma aspas de fechamento faltando, ou um apóstrofo dentro da string |
!= ou && no código |
Use ~= e and |
Respostas rápidas
O que significa 'unexpected symbol near' em Lua?
O analisador Lua encontrou um caractere ou palavra onde não pode ir. O texto após near é o token exato onde parou. O erro real está naquela linha ou na linha logo acima.
Por que 'end expected' aponta para uma linha diferente do erro?
Lua só percebe um end faltando quando chega ao fim do arquivo. A parte entre colchetes, como to close 'function' at line 12, diz qual bloco nunca foi fechado.
Por que um script falha em carregar com um erro de sintaxe mas nunca chega ao tempo de execução?
Um erro de sintaxe impede que todo o arquivo seja analisado, portanto nenhum de seus códigos é executado. Corrija o erro e o recurso carrega novamente.
Scripts sem esse problema
Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →
Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →
Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →