Lua Syntax-Fehler: unerwartetes Symbol nah, 'end' erwartet (FiveM)

FiveM-Ressource fehlgeschlagen mit einem Lua-Syntax-Fehler? Was 'unexpected symbol near', 'end expected' und 'unfinished string' bedeuten, wie man die Zeile findet und deinen Code linted.

Wenn eine Ressource lädt und eine ihrer Dateien nicht geparst werden kann, druckt die Konsole etwas wie das:

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

Das ist ein Syntax-Fehler: Die Datei ist kein gültiges Lua, daher läuft nichts darin. Es unterscheidet sich von einem Laufzeit-Fehler wie attempt to call a nil value, das passiert, während der Code läuft. Hier ist, was die häufigen Meldungen bedeuten und wie man die Zeile findet.

Lese die Meldung

Jeder Syntax-Fehler hat die gleichen Teile:

text
@my_script/server/main.lua:48: unexpected symbol near '<'
  • @my_script/server/main.lua ist die Datei, in der Ressource.
  • 48 ist die Zeile, wo der Parser aufgab. Der echte Fehler ist oft auf dieser Zeile oder auf der Zeile drüber.
  • near '<' ist das Token, das der Parser las, als er fehlgeschlagen. Suche nach ihm in der Datei.

Für die allgemeine Weise des Lesens von Konsolen-Fehlern, siehe how to read a FiveM script error.

Unerwartetes Symbol nah

Der Parser fand etwas, das nicht mit oder weiterführend eine Anweisung beginnen kann. Die üblichen Ursachen:

  • Die Datei ist nicht Lua. Wenn es sagt near '<', hast du möglicherweise eine HTML-Seite gespeichert anstelle der rohen Datei, zum Beispiel von einer Code-Hosting-Website. Öffne die Datei und überprüfe ihre ersten Zeilen.
  • Merge-Konflikt-Marker wie <<<<<<< und >>>>>>> leftover nach der Kombination von zwei Versionen.
  • Ein verlorenes Zeichen vom Kopieren von Code aus einem Chat oder einer Web-Seite: ein geschwungenes Anführungszeichen, ein sonderbar Leerzeichen, ein leftover Klammer.
  • Code aus einer anderen Sprache, wie != anstelle von ~=, oder && anstelle von and.
lua
-- wrong
if price != 0 then end

-- right
if price ~= 0 then end

Tipp: FiveM's Lua akzeptiert ein paar Ergänzungen zu Standard-Lua, zum Beispiel Compound-Assignment wie count += 1. Ein plain Lua Linter kann immer noch die Flagge setzen. Wenn dein Editor über eine Zeile beschwert, die auf dem Server funktioniert, ist das normalerweise warum.

'end' erwartet

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

Ein Block (function, if, for, while, do) wurde geöffnet und nie geschlossen. Lua findet das raus, wenn es das Ende der Datei erreicht, was das <eof> am Ende der Meldung ist.

Der Teil in Klammern ist der nützliche: er benennt den Block und die Zeile, wo er startete. Gehe zu Zeile 12 und folge diesem Block nach unten bis du findest, wo ein end fehlt. Das Ausrichten der Einrückung macht es offensichtlich:

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

Der gegenteilige Fehler existiert auch: einer end zu viele gibt '<eof>' expected near 'end'.

Die gleiche Logik gilt für Klammern. '}' expected (to close '{' at line 20) bedeutet, dass eine Tabelle nicht geschlossen wurde, und ')' expected near bedeutet, dass ein Aufruf oder eine Bedingung seinen schließenden Klammer vermisst. Ein fehlenden Komma zwischen zwei Tabelleneingaben erzeugt die gleiche Art von Meldung:

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

'=' erwartet nah

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

Der Parser erwartete eine Zuweisung und fand stattdessen einen Wert. Ein häufiger Fall ist ein Tabelleneintrag mit einem Schlüssel aber kein =:

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

Eine Zeile, die nur ein Name oder ein Wert ist, wie Config.Debug true, gibt normalerweise syntax error near statt. Die Behebung ist die gleiche: Finde, was auf dieser Zeile fehlt oder falsch geschrieben ist.

Unvollendeter String

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

Ein String wurde mit einem Anführungszeichen geöffnet und die Zeile endete, bevor er geschlossen wurde. Typische Ursachen sind ein fehlender schließender Anführungszeichen, oder ein Apostroph in einem Single-Quote-String:

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'

Für Text, der mehrere Zeilen umfasst, verwende einen langen String, da ein normaler String keinen Zeilenumbruch enthalten kann:

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

Finde die Zeile schneller

Lese nicht die ganze Datei. Öffne die Datei bei der gemeldeten Zeile, dann:

  1. Schau auf die Zeile selbst und die Zeile drüber.
  2. Wenn die Meldung eine Zeile in Klammern erwähnt, starte stattdessen von dieser Zeile.
  3. Kommentiere die Hälfte der Datei aus, dann lade neu. Ob der Fehler bleibt, sagt dir, welche Hälfte den Fehler hat.

Eine bessere Gewohnheit ist, diese zu fangen, bevor du den Server neu startest. Installiere einen Editor mit Lua-Unterstützung, wie VS Code mit einer Lua Language Server Erweiterung, und stelle seine Lua-Version auf 5.4, um FiveM zu entsprechen. Es unterstreicht ungeschlossene Blöcke und fehlende Klammern, während du tippst. Ein Setup-Leitfaden ist in setting up VS Code for FiveM.

Wenn du die Standard-Lua-Tools installiert hast, luac -p file.lua überprüft die Syntax einer Datei, ohne sie auszuführen.

Checkliste

Symptom Behebung
unexpected symbol near '<' Die Datei ist HTML oder hat Merge-Konflikt-Marker; hole die rohe Datei erneut
unexpected symbol near ein sonderbar Zeichen Ein eingefügtes geschwungenes Anführungszeichen oder sonderbar Zeichen; tippe die Zeile neu
'end' expected (to close 'function' at line N) near <eof> Gehe zu Zeile N und finde den Block, dem sein end fehlt
'<eof>' expected near 'end' Ein end zu viele; überprüfe die Einrückung drüber
'=' expected near Ein Tabellenschlüssel ohne =, oder ein fehlendes Komma vor
unfinished string near Ein fehlendes schließendes Anführungszeichen, oder ein Apostroph im String
!= oder && im Code Verwende ~= und and

Kurze Antworten

Was bedeutet 'unexpected symbol near' in Lua?

Der Lua-Parser fand ein Zeichen oder Wort, wo es nicht hingehen kann. Der Text nach near ist das genaue Token, bei dem es stoppte. Der echte Fehler ist auf dieser Zeile oder der Zeile direkt davor.

Warum zeigt 'end expected' auf eine andere Zeile als der Fehler?

Lua merkt nur, dass ein end fehlt, wenn es das Ende der Datei erreicht. Der Teil in Klammern, wie to close 'function' at line 12, sagt dir, welcher Block nie geschlossen wurde.

Warum schlägt ein Skript fehl zu laden mit einem Syntax-Fehler, erreicht aber nie die Laufzeit?

Ein Syntax-Fehler stoppt die ganze Datei, damit sie nicht geparst wird, daher kein Code davon läuft. Behebe den Fehler und die Ressource lädt erneut.

Scripts ohne dieses Problem

Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →

Weiterlesen