Errore di sintassi Lua: simbolo inaspettato vicino, 'end' previsto (FiveM)

La risorsa FiveM fallisce con un errore di sintassi Lua? Cosa significano 'unexpected symbol near', 'end expected' e 'unfinished string', come trovare la riga e lintare il tuo codice.

Quando una risorsa si carica e uno dei suoi file non può essere analizzato, la console stampa qualcosa di simile:

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

Questo è un errore di sintassi: il file non è un Lua valido, quindi nulla in esso viene eseguito. È diverso da un errore di runtime come attempt to call a nil value, che accade mentre il codice è in esecuzione. Ecco cosa significano i messaggi comuni e come trovare la riga.

Leggi il messaggio

Ogni errore di sintassi ha le stesse parti:

text
@my_script/server/main.lua:48: unexpected symbol near '<'
  • @my_script/server/main.lua è il file, all'interno della risorsa.
  • 48 è la riga dove il parser ha rinunciato. L'errore vero è spesso su quella riga o sulla riga sopra.
  • near '<' è il token che il parser stava leggendo quando è fallito. Cercalo nel file.

Per il modo generale di leggere gli errori della console, vedi how to read a FiveM script error.

unexpected symbol near

Il parser ha trovato qualcosa che non può iniziare o continuare un'istruzione. Le solite cause:

  • Il file non è Lua. Se dice near '<', potresti aver salvato una pagina HTML invece del file grezzo, ad esempio da un sito di hosting di codice. Apri il file e controlla le sue prime righe.
  • Merge conflict markers come <<<<<<< e >>>>>>> rimasti dopo aver combinato due versioni.
  • Un carattere stray dal copia-incolla di codice fuori da una chat o da una pagina web: una virgoletta riccia, uno spazio strano, una parentesi rimasta.
  • Codice da un'altra lingua, come != invece di ~=, o && invece di and.
lua
-- wrong
if price != 0 then end

-- right
if price ~= 0 then end

Consiglio: FiveM's Lua accetta alcuni aggiungimenti a Lua standard, ad esempio assegnamento composto come count += 1. Un linter Lua semplice potrebbe comunque segnalarli. Se il tuo editor si lamenta di una riga che funziona sul server, di solito è per questo.

'end' expected

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

Un blocco (function, if, for, while, do) è stato aperto e mai chiuso. Lua lo scopre solo quando raggiunge la fine del file, che è <eof> alla fine del messaggio.

La parte tra parentesi è quella utile: chiama il blocco e la riga dove è iniziato. Vai alla riga 12 e segui quel blocco fino a quando trovi dove manca un end. Allineare l'indentazione lo rende ovvio:

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

Esiste anche l'errore opposto: un end troppo dà '<eof>' expected near 'end'.

La stessa logica si applica alle parentesi. '}' expected (to close '{' at line 20) significa una tabella non è stata chiusa, e ')' expected near significa una chiamata o condizione manca della sua parentesi di chiusura. Una virgola mancante tra due voci di tabella produce lo stesso tipo di messaggio:

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''

Il parser si aspettava un'assegnazione e ha trovato un valore al contrario. Un caso frequente è una voce di tabella con una chiave ma nessun =:

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

Una riga che è solo un nome o un valore, come Config.Debug true, di solito dà syntax error near al contrario. La correzione è la stessa: trova cosa manca o è digitato male su quella riga.

unfinished string

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

Una stringa è stata aperta con una virgoletta e la riga è terminata prima che fosse chiusa. Le cause tipiche sono una virgoletta di chiusura mancante, o un apostrofo dentro una stringa tra virgolette singole:

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'

Per il testo che copre più righe, usa una stringa lunga, poiché una stringa normale non può contenere un'interruzione di riga:

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

Trova la riga più velocemente

Non leggere l'intero file. Apri il file alla riga segnalata, quindi:

  1. Guarda la riga stessa e la riga sopra.
  2. Se il messaggio menziona una riga tra parentesi, inizia da quella riga al contrario.
  3. Commenta metà del file, quindi ricarica. Se l'errore rimane ti dice quale metà ha l'errore.

Un'abitudine migliore è cogliere questi prima di riavviare il server. Installa un editor con supporto Lua, come VS Code con un'estensione del server di linguaggio Lua, e imposta la sua versione Lua su 5.4 per abbinare FiveM. Sottolinea i blocchi non chiusi e le parentesi mancanti mentre digiti. Una guida di configurazione è in setting up VS Code for FiveM.

Se hai gli strumenti Lua standard installati, luac -p file.lua controlla la sintassi di un file senza eseguirlo.

Elenco di controllo

Sintomo Correzione
unexpected symbol near '<' Il file è HTML o ha merge conflict markers; ottieni il file grezzo di nuovo
unexpected symbol near un carattere strano Una virgoletta riccia incollata o un carattere strano; riscrivi la riga
'end' expected (to close 'function' at line N) near <eof> Vai alla riga N e trova il blocco mancante il suo end
'<eof>' expected near 'end' Un end troppo; controlla l'indentazione sopra
'=' expected near Una chiave di tabella senza =, o una virgola mancante prima di essa
unfinished string near Una virgoletta di chiusura mancante, o un apostrofo dentro la stringa
!= o && nel codice Usa ~= e and

Risposte rapide

Cosa significa 'unexpected symbol near' in Lua?

Il parser Lua ha trovato un carattere o una parola dove non può andare. Il testo dopo near è il token esatto dove si è fermato. L'errore vero è su quella riga o sulla riga appena prima.

Perché 'end expected' punta a una riga diversa dall'errore?

Lua nota solo un end mancante quando raggiunge la fine del file. La parte tra parentesi, come to close 'function' at line 12, ti dice quale blocco non è mai stato chiuso.

Perché uno script non riesce a caricarsi con un errore di sintassi ma non raggiunge mai il runtime?

Un errore di sintassi ferma l'intero file dall'essere analizzato, quindi nessuno dei suoi codici viene eseguito. Correggi l'errore e la risorsa si carica di nuovo.

Script senza questo problema

Quest CreatorUn editor visuale di missioni e dialoghi con gli NPC, costruito nodo per nodo in gioco.Vedi script →Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →

Continua a leggere