Co to jest syntax error (błąd składniowy)?
Syntax error, czyli błąd składniowy, to pomyłka w strukturze kodu, na przykład brakujący dwukropek, nawias lub cudzysłów, która łamie reguły gramatyczne języka programowania. Kompilator lub interpreter odrzuca program, zanim wykona się którakolwiek jego część.
Aktualizacja: 24 września 2026
Zanim Python wykona choćby jedną linię twojego programu, czyta cały plik i sprawdza, czy trzyma się on gramatyki języka. Jeśli jedna linia tę gramatykę łamie, nie wykonuje się nic. Uruchom ten program i zobacz, co się nie wydarzy: pierwsze print nic nie wypisze.
File "main.py", line 4
if temperature > 30
^
SyntaxError: expected ':'
Linia 1 jest całkowicie poprawna, a mimo to w wyniku nie ma „Checking the temperature”. Python odrzucił cały plik, bo linia if musi kończyć się dwukropkiem. Dodaj : po 30, uruchom program jeszcze raz, a wypiszą się obie linie.
Jak wykrywany jest błąd składniowy
Każdy język programowania ma gramatykę: które słowa są dozwolone, gdzie otwierają się i zamykają nawiasy, co musi nastąpić po if. Program, który ją sprawdza, nazywa się parserem i działa na pierwszym etapie zamieniania kodu źródłowego na coś, co maszyna może wykonać.
- Tokenizer dzieli tekst na tokeny:
if,temperature,>,30i tak dalej. - Parser czyta tokeny po kolei i dopasowuje je do gramatyki. Po
if temperature > 30oczekuje:, a trafia na koniec linii. - Zatrzymuje się i zgłasza miejsce, w którym się poddał: plik, numer linii i daszek (
^) pod tą pozycją. - Ponieważ parsowanie się nie powiodło, nie powstaje żaden kod, więc nie wykonuje się żadna linia programu.
W CPythonie parser działa za każdym razem, gdy uruchamiasz skrypt. W językach z osobnym etapem budowania tę kontrolę wykonuje kompilator: gcc, clang i javac odmawiają utworzenia programu, dopóki zostaje choć jeden błąd składniowy. Dlatego błędy składniowe zalicza się do błędów czasu kompilacji, w przeciwieństwie do błędu wykonania, który pojawia się, gdy program już działa.
Częste błędy składniowe w Pythonie
Oto pomyłki, które stoją za większością błędów składniowych widywanych przez początkujących, z dokładnym komunikatem wypisywanym przez Pythona 3.12.
| Kod | Komunikat | Poprawka |
|---|---|---|
if x > 3 | SyntaxError: expected ':' | Kończ linie if, for, while, def i class znakiem : |
print("Hi" | SyntaxError: '(' was never closed | Zamykaj każdy otwarty nawias |
name = "Ada | SyntaxError: unterminated string literal (detected at line 1) | Zamknij cudzysłów |
if x = 5: | SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | Porównuj za pomocą == |
print "Hi" | SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? | Python 3 wymaga print(...) |
if a > 0 && b > 0: | SyntaxError: invalid syntax | Python używa and, or i not |
if bez żadnej wciętej linii pod spodem | IndentationError: expected an indented block after 'if' statement on line 1 | Wcinaj ciało bloku o cztery spacje |
IndentationError to rodzaj SyntaxError: w Pythonie wcięcia są częścią gramatyki.
Nie każda literówka jest błędem składniowym. pritn("hello") jest w pełni zgodne z gramatyką, bo nazwa z nawiasami to wywołanie funkcji. Python odkrywa, że funkcja o nazwie pritn nie istnieje, dopiero gdy dochodzi do tej linii, i wtedy zgłasza NameError: name 'pritn' is not defined. Did you mean: 'print'?. To jest błąd wykonania, a wszystkie linie powyżej zdążyły się już wykonać.
Dlaczego zgłoszona linia może być zła
Parser zgłasza miejsce, w którym nie mógł iść dalej, a to nie zawsze jest miejsce pomyłki. Klasyczny przypadek to niezamknięty nawias: parser nie może wiedzieć, że nawias nigdy nie został zamknięty, dopóki nie przeczyta tekstu poza miejscem, w którym powinien być zamknięty.
File "main.py", line 1
prices = [4.50, 3.20, 7.80
^
SyntaxError: '[' was never closed
Python 3.10 i nowsze wskazują otwierający [ w linii 1. Python 3.9 i starsze zgłaszały tylko invalid syntax w linii 2, czyli w linii po faktycznej pomyłce. Gdy więc zgłoszona linia wygląda poprawnie, sprawdź koniec linii nad nią.
Inne parsery zachowują się tak samo. Dla SELECT name FORM users;, z literówką w FROM, SQLite odczytuje FORM jako alias (drugą nazwę) kolumny name i wywraca się dopiero słowo dalej:
Parse error near line 1: near "users": syntax error
SELECT name FORM users;
^--- error here
Błędy składniowe w C, Javie i JavaScripcie
Języki kompilowane zgłaszają błędy składniowe podczas budowania, a nie uruchamiania. Oto deklaracja bez średnika, skompilowana Clangiem (kompilatorem, który na macOS uruchamia polecenie gcc):
#include <stdio.h>
int main(void) {
int count = 3
printf("%d\n", count);
return 0;
}
main.c:4:18: error: expected ';' at end of declaration
javac zgłasza tę samą pomyłkę w Javie jako error: ';' expected i nie zapisuje pliku .class. W C jeden brakujący nawias klamrowy może wywołać kilkanaście błędów dalej w pliku. Popraw pierwszy i skompiluj ponownie, bo pozostałe są często jego skutkiem.
Silniki JavaScriptu, takie jak V8, parsują cały skrypt przed uruchomieniem, dokładnie jak Python. Node.js odrzuca ten plik, zanim wypisze „start”:
console.log("start");
if (x > 1 {
console.log("big");
}
SyntaxError: Unexpected token '{'
W przeglądarce błąd składniowy zatrzymuje tylko ten jeden plik skryptu, a inne skrypty na stronie nadal działają.
Jak naprawić błąd składniowy
- Najpierw przeczytaj ostatnią linię komunikatu. Nazywa problem: brakujący
:, niezamknięty(, nieoczekiwany token. - Przejdź do zgłoszonej linii i spójrz na daszek. Jeśli linia wygląda dobrze, sprawdź linię nad nią.
- Sprawdź pary. Każdy
(,[,{i cudzysłów potrzebuje partnera. Większość edytorów podświetla pasujący nawias, gdy kursor stoi obok. - Sprawdź znaki, których wymaga język: dwukropki i wcięcia w Pythonie, średniki i nawiasy klamrowe w C, Javie i JavaScripcie.
- Popraw tylko pierwszy błąd i uruchom program ponownie. Kolejne komunikaty często wynikają z pierwszego.
- Obserwuj podświetlanie składni. Po niezamkniętym cudzysłowie reszta pliku zwykle przyjmuje kolor napisu, co pokazuje, gdzie się zaczął.
Dobra wiadomość: błędy składniowe najłatwiej naprawić, bo narzędzie mówi ci, że coś jest nie tak, i mniej więcej gdzie. Trudniejsze rodzaje błędów przychodzą później, gdy kod działa.
Co dalej
Program, który przejdzie przez parser, wciąż może się wysypać w trakcie działania, a to już błąd wykonania. Program, który dochodzi do końca, ale wypisuje złą odpowiedź, ma błąd logiczny, a tamta strona porównuje wszystkie trzy typy w jednej tabeli. Same reguły gramatyczne znajdziesz w przewodnikach po składni Pythona i składni C, a przećwiczysz je w kursie Pythona.
Najczęściej zadawane pytania
Jaki jest przykład błędu składniowego?
print("Hello" to błąd składniowy, podobnie jak linia if bez dwukropka w Pythonie: if x > 3. W C i Javie najczęstszy jest brak średnika na końcu instrukcji. W każdym przypadku kod nie trzyma się gramatyki, więc nie może się wykonać.Czym różni się błąd składniowy od błędu semantycznego?
int w Javie; inne traktują go jako inną nazwę błędu logicznego.Co to jest błąd składniowy w C?
gcc i clang wypisują plik, linię i kolumnę, na przykład main.c:4:18: error: expected ';' at end of declaration, i nie tworzą pliku wykonywalnego, dopóki wszystkie błędy nie zostaną poprawione.Dlaczego Python nie poprawia błędów składniowych automatycznie?
Did you mean print(...)?, ale decyzję zostawia tobie.Co oznacza syntax error na kalkulatorze?
ERR:SYNTAX.