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:
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:
@my_script/server/main.lua:48: unexpected symbol near '<'@my_script/server/main.luaist die Datei, in der Ressource.48ist 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 vonand.
-- wrong
if price != 0 then end
-- right
if price ~= 0 then endTipp: 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
@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:
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 closedDer 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:
Config.Shops = {
{ name = 'Bar', price = 10 } -- missing comma
{ name = 'Cafe', price = 12 },
}'=' erwartet nah
@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 =:
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
@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:
-- 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:
local help = [[
Line one
Line two
]]Finde die Zeile schneller
Lese nicht die ganze Datei. Öffne die Datei bei der gemeldeten Zeile, dann:
- Schau auf die Zeile selbst und die Zeile drüber.
- Wenn die Meldung eine Zeile in Klammern erwähnt, starte stattdessen von dieser Zeile.
- 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 →