Erreur de syntaxe Lua : symbole inattendu près, 'end' attendu (FiveM)

La resource FiveM échoue avec une erreur de syntaxe Lua ? Ce que « unexpected symbol near », « end expected » et « unfinished string » signifient, comment trouver la ligne et linter votre code.

Quand une resource se charge et l'un de ses fichiers ne peut pas être parsé, la console imprime quelque chose comme ceci :

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

Ceci est une erreur de syntaxe : le fichier n'est pas du Lua valide, donc rien dedans ne s'exécute. C'est différent d'une erreur runtime comme tentative d'appel d'une valeur nil, qui se produit pendant que le code s'exécute. Voici ce que les messages courants signifient et comment trouver la ligne.

Lisez le message

Chaque erreur de syntaxe a les mêmes parties :

text
@my_script/server/main.lua:48: unexpected symbol near '<'
  • @my_script/server/main.lua est le fichier, à l'intérieur de la resource.
  • 48 est la ligne où l'analyseur a abandonné. La vraie faute est souvent sur cette ligne ou sur celle ci-dessus.
  • near '<' est le jeton que l'analyseur lisait quand il a échoué. Recherchez-le dans le fichier.

Pour le moyen général de lire les erreurs de console, voir comment lire une erreur de script FiveM.

unexpected symbol near

L'analyseur a trouvé quelque chose qui ne peut pas commencer ou continuer une déclaration. Les causes habituelles :

  • Le fichier n'est pas Lua. S'il dit near '<', vous avez peut-être enregistré une page HTML au lieu du fichier brut, par exemple d'un site d'hébergement de code. Ouvrez le fichier et vérifiez ses premières lignes.
  • Marqueurs de conflit de fusion comme <<<<<<< et >>>>>>> laissés après la combinaison de deux versions.
  • Un caractère fouineur de la copie de code d'un chat ou d'une page Web : une guillemet courbe, un espace étrange, un crochet restant.
  • Code d'un autre langage, comme != au lieu de ~=, ou && au lieu de and.
lua
-- wrong
if price != 0 then end

-- right
if price ~= 0 then end

Conseil : Lua FiveM accepte quelques ajouts à Lua standard, par exemple l'affectation composée telle que count += 1. Un linter Lua simple peut quand même le signaler. Si votre éditeur se plaint d'une ligne qui fonctionne sur le serveur, c'est généralement pourquoi.

'end' expected

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

Un bloc (function, if, for, while, do) a été ouvert et n'a jamais été fermé. Lua le découvre seulement quand il atteint la fin du fichier, qui est le <eof> à la fin du message.

La partie entre crochets est l'utile : elle nomme le bloc et la ligne où il a commencé. Allez à la ligne 12 et suivez ce bloc jusqu'à ce que vous trouviez où un end manque. Aligner l'indentation le rend évident :

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

L'erreur opposée existe aussi : un end de trop donne '<eof>' expected near 'end'.

La même logique s'applique aux crochets. '}' expected (to close '{' at line 20) signifie une table n'était pas fermée, et ')' expected near signifie un appel ou une condition manque son crochet de fermeture. Une virgule manquante entre deux entrées de table produit le même genre de message :

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

L'analyseur attendait une affectation et a trouvé une valeur à la place. Un cas fréquent est une entrée de table avec une clé mais pas de = :

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

Une ligne qui n'est qu'un nom ou une valeur, comme Config.Debug true, donne généralement syntax error near à la place. Le correctif est le même : trouvez ce qui manque ou est mal tapé sur cette ligne.

unfinished string

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

Une chaîne a été ouverte avec une guillemet et la ligne s'est terminée avant qu'elle ne soit fermée. Les causes typiques sont une guillemet de fermeture manquante, ou une apostrophe à l'intérieur d'une chaîne entre guillemets simples :

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'

Pour un texte qui s'étend sur plusieurs lignes, utilisez une longue chaîne, car une chaîne normale ne peut pas contenir un saut de ligne :

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

Trouvez la ligne plus rapidement

Ne lisez pas le fichier entier. Ouvrez le fichier à la ligne rapportée, puis :

  1. Regardez la ligne elle-même et la ligne ci-dessus.
  2. Si le message mentionne une ligne entre crochets, commencez par cette ligne à la place.
  3. Commentez la moitié du fichier, puis rechargez. Que l'erreur persiste vous dit quelle moitié a la faute.

Une meilleure habitude est de les attraper avant de redémarrer le serveur. Installez un éditeur avec support Lua, comme VS Code avec une extension de serveur de langage Lua, et réglez sa version Lua sur 5.4 pour correspondre à FiveM. Il souligne les blocs non fermés et les crochets manquants au fur et à mesure que vous tapez. Un guide de configuration se trouve dans configuration de VS Code pour FiveM.

Si vous avez les outils Lua standard installés, luac -p file.lua vérifie la syntaxe d'un fichier sans l'exécuter.

Liste de contrôle

Symptôme Correction
unexpected symbol near '<' Le fichier est HTML ou a des marqueurs de conflit de fusion ; obtenez le fichier brut à nouveau
unexpected symbol near un caractère étrange Une guillemet courbe collée ou un caractère étrange ; retapez la ligne
'end' expected (to close 'function' at line N) near <eof> Allez à la ligne N et trouvez le bloc manquant son end
'<eof>' expected near 'end' Un end de trop ; vérifiez l'indentation ci-dessus
'=' expected near Une clé de table sans =, ou une virgule manquante avant
unfinished string near Une guillemet de fermeture manquante, ou une apostrophe à l'intérieur de la chaîne
!= ou && dans le code Utilisez ~= et and

Réponses rapides

Que signifie « unexpected symbol near » en Lua ?

L'analyseur Lua a trouvé un caractère ou un mot où il ne peut pas aller. Le texte après near est le jeton exact où il s'est arrêté. La vraie faute est sur cette ligne ou la ligne juste avant.

Pourquoi « end expected » pointe-t-il une ligne différente de la faute ?

Lua ne remarque un end manquant que quand il atteint la fin du fichier. La partie entre crochets, telle que to close 'function' at line 12, vous dit quel bloc n'a jamais été fermé.

Pourquoi un script échoue-t-il à charger avec une erreur de syntaxe mais n'atteint jamais le runtime ?

Une erreur de syntaxe empêche le fichier entier d'être parsé, donc aucun de ses codes ne s'exécute. Corrigez l'erreur et la resource charge à nouveau.

Des scripts sans ce problème

Quest CreatorUn éditeur visuel de quêtes et de dialogues PNJ, construit nœud par nœud en jeu.Voir le script →Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →

À lire aussi