Błąd składni Lua: unexpected symbol near, 'end' expected (FiveM)
Zasób FiveM zawala się z błędem składni Lua? Co oznaczają 'unexpected symbol near', 'end expected' i 'unfinished string', jak znaleźć linię i lint swój kod.
Gdy zasób się ładuje i jeden z jego plików nie może być przeanalizowany, konsola drukuje coś w tym stylu:
Error parsing script @my_script/server/main.lua in resource my_script: @my_script/server/main.lua:48: unexpected symbol near '<'To jest błąd składni: plik nie jest prawidłowym Lua, więc nic w nim się nie uruchamia. Różni się od błędu runtime, takiego jak attempt to call a nil value, które zdarza się, gdy kod jest uruchamiany. Oto, co oznaczają zwyczajne wiadomości i jak znaleźć linię.
Przeczytaj wiadomość
Każdy błąd składni ma te same części:
@my_script/server/main.lua:48: unexpected symbol near '<'@my_script/server/main.luato plik, wewnątrz zasobu.48to linia, na której parser się poddał. Prawdziwy błąd jest często na tej linii lub na linii wyżej.near '<'to token, który parser czytał, gdy zawiedł. Poszukaj go w pliku.
Aby zapoznać się ogólnym sposobem czytania błędów konsoli, przeczytaj jak przeczytać błąd skryptu FiveM.
unexpected symbol near
Parser znalazł coś, co nie może uruchomić ani kontynuować instrukcji. Zwyczajne przyczyny:
- Plik to nie Lua. Jeśli mówi
near '<', mogłeś zapisać stronę HTML zamiast surowego pliku, na przykład ze strony hostingu kodu. Otwórz plik i sprawdzaj jego pierwsze linie. - Znaki konfliktów fuzji, takie jak
<<<<<<<i>>>>>>>, pozostawione po połączeniu dwóch wersji. - Błędny charakter z kopiowania kodu z czatu lub strony internetowej: krzywa cudzysłów, dziwna spacja, pozostały nawias.
- Kod z innego języka, takie jak
!=zamiast~=, lub&&zamiastand.
-- wrong
if price != 0 then end
-- right
if price ~= 0 then endPorada: Lua FiveM akceptuje kilka dodatków do standardowego Lua, na przykład złożone przypisanie takie jak
count += 1. Zwykły linter Lua może je wciąż flagować. Jeśli edytor narzeka na linię, która działa na serwerze, zwykle to dlatego.
'end' expected
@my_script/client/main.lua:130: 'end' expected (to close 'function' at line 12) near <eof>Blok (function, if, for, while, do) był otwarty i nigdy nie został zamknięty. Lua dowiaduje się o tym dopiero, gdy osiągnie koniec pliku, czyli <eof> na końcu wiadomości.
Część w nawiasach jest przydatna: wymienia blok i linię, na której się zaczął. Przejdź do linii 12 i podążaj tym blokiem w dół, aż znajdziesz, gdzie brakuje end. Wyrównanie wcięcia czyni to oczywistym:
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 closedOdwrotny błąd również istnieje: jeden end za dużo daje '<eof>' expected near 'end'.
Ta sama logika stosuje się do nawiasów. '}' expected (to close '{' at line 20) oznacza, że tabela nie została zamknięta, a ')' expected near oznacza, że wezwanie lub warunek brakuje swojego nawiasu zamykającego. Brakujący przecinek między dwoma wpisami tabeli tworzy ten sam rodzaj wiadomości:
Config.Shops = {
{ name = 'Bar', price = 10 } -- missing comma
{ name = 'Cafe', price = 12 },
}'=' expected near
@my_script/shared/config.lua:9: '=' expected near ''bar''Parser oczekiwał przypisania i znalazł zamiast tego wartość. Częstym przypadkiem jest wpis tabeli z kluczem, ale bez =:
Config.Prices = {
['burger'] 10, -- wrong: missing =
['water'] = 5,
}Linia, która jest tylko nazwą lub wartością, takie jak Config.Debug true, zwykle daje syntax error near. Naprawa jest taka sama: znajdź, co brakuje lub jest błędnie napisane na tej linii.
unfinished string
@my_script/client/main.lua:33: unfinished string near '"You need 'String został otwarty cudzysłowem i linia się skończyła, zanim go zamknął. Typowe przyczyny to brakujący cudzysłów zamykający lub apostrof wewnątrz stringa w cudzysłowach:
-- 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'Dla tekstu, który rozciąga się na kilka linii, używaj długiego stringa, ponieważ normalny string nie może zawierać podziału linii:
local help = [[
Line one
Line two
]]Znajdź linię szybciej
Nie czytaj całego pliku. Otwórz plik na podanej linii, a następnie:
- Spójrz na samą linię i linię powyżej.
- Jeśli wiadomość wymienia linię w nawiasach, zamiast tego zacznij od tej linii.
- Skomentuj połowę pliku, potem przeładuj. Czy błąd pozostaje, mówi ci, która połowa ma błąd.
Lepszym nawykiem jest złapanie ich przed restartowaniem serwera. Zainstaluj edytor z obsługą Lua, takie jak VS Code z rozszerzeniem serwera języka Lua i ustaw jego wersję Lua na 5.4, aby pasować do FiveM. Podkreśla niezamknięte bloki i brakujące nawiasy podczas pisania. Przewodnik konfiguracji jest w konfiguracji VS Code dla FiveM.
Jeśli masz zainstalowane standardowe narzędzia Lua, luac -p file.lua sprawdza składnię pliku bez jego uruchamiania.
Lista kontrolna
| Objaw | Naprawa |
|---|---|
unexpected symbol near '<' |
Plik to HTML lub ma znaki konfliktu fuzji; pobierz surowy plik ponownie |
unexpected symbol near dziwny charakter |
Wklejony krzywy cudzysłów lub dziwny charakter; przepisz linię |
'end' expected (to close 'function' at line N) near <eof> |
Przejdź do linii N i znajdź blok brakujący jego end |
'<eof>' expected near 'end' |
Jeden end za dużo; sprawdzaj wcięcie powyżej |
'=' expected near |
Klucz tabeli bez =, lub brakujący przecinek przed nim |
unfinished string near |
Brakujący cudzysłów zamykający, lub apostrof wewnątrz stringa |
!= lub && w kodzie |
Używaj ~= i and |
Szybkie odpowiedzi
Co oznacza 'unexpected symbol near' w Lua?
Parser Lua znalazł charakter lub słowo, gdzie nie może się znaleźć. Tekst po near to dokładny token, na którym się zatrzymał. Prawdziwy błąd jest na tej linii lub linii tuż przed nią.
Dlaczego 'end expected' wskazuje inną linię niż błąd?
Lua zauważa brakujący end tylko, gdy osiągnie koniec pliku. Część w nawiasach, takie jak to close 'function' at line 12, mówi ci, który blok nigdy nie został zamknięty.
Dlaczego skrypt zawala się z błędem składni, ale nigdy nie osiąga runtime?
Błąd składni zatrzymuje cały plik przed przeanalizowaniem, więc żaden z jego kodów się nie uruchamia. Napraw błąd i zasób się ponownie ładuje.
Skrypty bez tego problemu
Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →
Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →
Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →