מה זה Syntax Error (שגיאת תחביר)?
שגיאת תחביר (syntax error) היא טעות במבנה של הקוד, למשל נקודתיים, סוגריים או מירכאות חסרים, שמפרה את כללי הדקדוק של שפת התכנות. הקומפיילר או המפרש דוחים את התוכנית לפני שחלק כלשהו ממנה רץ.
עודכן ב-24 בספטמבר 2026
לפני ש-Python מריץ אפילו שורה אחת מהתוכנית שלכם, הוא קורא את כל הקובץ ובודק שהוא עומד בדקדוק של השפה. אם שורה אחת מפרה את הדקדוק הזה, שום דבר לא רץ. הריצו את התוכנית הזו ושימו לב למה שלא קורה: ה-print הראשון אף פעם לא מדפיס.
File "main.py", line 4
if temperature > 30
^
SyntaxError: expected ':'
שורה 1 תקינה לגמרי, ובכל זאת "Checking the temperature" חסר בפלט. Python דחה את הקובץ כולו, כי שורת if חייבת להסתיים בנקודתיים. הוסיפו את ה-: אחרי 30, הריצו שוב, ושתי השורות יודפסו.
איך שגיאת תחביר מתגלה
לכל שפת תכנות יש דקדוק: אילו מילים מותרות, איפה סוגריים נפתחים ונסגרים, מה חייב לבוא אחרי if. התוכנית שבודקת אותו נקראת parser (מנתח תחבירי), והיא פועלת בשלב הראשון של הפיכת קוד מקור למשהו שמכונה יכולה להריץ.
- ה-tokenizer מפרק את הטקסט ליחידות (tokens):
if,temperature,>,30, וכן הלאה. - ה-parser קורא את היחידות לפי הסדר ומתאים אותן לדקדוק. אחרי
if temperature > 30הוא מצפה ל-:, אבל הוא מוצא את סוף השורה. - הוא עוצר ומדווח על המקום שבו הוא ויתר: הקובץ, מספר השורה, וסימן
^(caret) מתחת למיקום. - מכיוון שהניתוח נכשל, לא נוצר קוד, ולכן אף שורה בתוכנית לא רצה.
ב-CPython ה-parser רץ בכל פעם שמפעילים סקריפט. בשפות עם שלב בנייה נפרד, הקומפיילר מבצע את הבדיקה הזו: gcc, clang ו-javac מסרבים לייצר תוכנית כל עוד נשארה אפילו שגיאת תחביר אחת. בגלל זה שגיאות תחביר נחשבות לשגיאות זמן קומפילציה, בניגוד לשגיאת זמן ריצה, שקורית כשהתוכנית כבר רצה.
שגיאות תחביר נפוצות ב-Python
אלה הטעויות שעומדות מאחורי רוב שגיאות התחביר שמתחילים רואים, עם ההודעה המדויקת ש-Python 3.12 מדפיס.
| קוד | הודעה | תיקון |
|---|---|---|
if x > 3 | SyntaxError: expected ':' | סיימו שורות if, for, while, def ו-class ב-: |
print("Hi" | SyntaxError: '(' was never closed | סגרו כל סוגר שאתם פותחים |
name = "Ada | SyntaxError: unterminated string literal (detected at line 1) | סגרו את המירכאות |
if x = 5: | SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | השוו עם == |
print "Hi" | SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? | Python 3 דורש print(...) |
if a > 0 && b > 0: | SyntaxError: invalid syntax | Python משתמש ב-and, or ו-not |
if בלי שורה מוזחת מתחתיו | IndentationError: expected an indented block after 'if' statement on line 1 | הזיחו את הגוף בארבעה רווחים |
IndentationError הוא סוג של SyntaxError: ב-Python, ההזחה היא חלק מהדקדוק.
לא כל שגיאת הקלדה היא שגיאת תחביר. pritn("hello") עומד בדקדוק בצורה מושלמת, כי שם שאחריו סוגריים הוא קריאה לפונקציה. Python מגלה שאין פונקציה בשם pritn רק כשהוא מגיע לשורה הזו, ואז הוא מעלה NameError: name 'pritn' is not defined. Did you mean: 'print'?. זו שגיאת זמן ריצה, וכל השורות שמעליה כבר רצו.
למה השורה המדווחת יכולה להיות שגויה
ה-parser מדווח על הנקודה שבה הוא כבר לא יכול היה להמשיך, וזו לא תמיד הנקודה שבה נמצאת הטעות. סוגר שלא נסגר הוא המקרה הקלאסי: ה-parser לא יכול לדעת שהסוגר אף פעם לא נסגר עד שהוא קורא מעבר למקום שבו הוא היה אמור להיסגר.
File "main.py", line 1
prices = [4.50, 3.20, 7.80
^
SyntaxError: '[' was never closed
Python 3.10 ומעלה מצביעים על ה-[ הפותח בשורה 1. Python 3.9 וגרסאות ישנות יותר דיווחו רק invalid syntax בשורה 2, השורה שאחרי הטעות האמיתית. לכן כששורה מדווחת נראית תקינה, בדקו את סוף השורה שמעליה.
גם parsers אחרים מתנהגים באותה צורה. בהינתן SELECT name FORM users;, עם FROM בשגיאת כתיב, SQLite קורא את FORM ככינוי (alias, שם שני) לעמודה name, ונכשל רק מילה אחת מאוחר יותר:
Parse error near line 1: near "users": syntax error
SELECT name FORM users;
^--- error here
שגיאות תחביר ב-C, Java ו-JavaScript
שפות מקומפלות מדווחות על שגיאות תחביר בזמן הבנייה, לא בזמן ההרצה. הנה הצהרה בלי נקודה-פסיק, מקומפלת עם Clang (הקומפיילר שהפקודה gcc מריצה ב-macOS):
#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 מדווח על אותה טעות ב-Java כ-error: ';' expected, ולא נכתב שום קובץ .class. ב-C, סוגר מסולסל אחד חסר יכול לייצר תריסר שגיאות בהמשך הקובץ. תקנו את הראשונה וקמפלו שוב, כי האחרות הן לעיתים קרובות תוצאה שלה.
מנועי JavaScript כמו V8 מנתחים סקריפט שלם לפני שהם מריצים אותו, בדיוק כמו Python. Node.js דוחה את הקובץ הזה לפני שהוא מדפיס "start":
console.log("start");
if (x > 1 {
console.log("big");
}
SyntaxError: Unexpected token '{'
בדפדפן, שגיאת תחביר עוצרת רק את קובץ הסקריפט הזה, וסקריפטים אחרים בדף עדיין רצים.
איך מתקנים שגיאת תחביר
- קראו קודם את השורה האחרונה של ההודעה. היא מציינת את הבעיה:
:חסרות,(שלא נסגר, token לא צפוי. - עברו לשורה המדווחת והסתכלו על ה-caret. אם השורה נראית תקינה, בדקו את השורה שמעליה.
- בדקו זוגות. כל
(,[,{וכל מירכאות צריכים בן זוג. רוב העורכים מדגישים את הסוגר המתאים כשהסמן נמצא ליד אחד מהם. - בדקו את סימני הפיסוק שהשפה דורשת: נקודתיים והזחה ב-Python, נקודה-פסיק וסוגריים מסולסלים ב-C, Java ו-JavaScript.
- תקנו רק את השגיאה הראשונה, ואז הריצו שוב. הודעות מאוחרות יותר נגרמות לעיתים קרובות מהראשונה.
- שימו לב להדגשת התחביר. אחרי מירכאות שלא נסגרו, שאר הקובץ בדרך כלל נצבע בצבע של מחרוזת, וזה מראה לכם איפה היא התחילה.
החדשות הטובות הן ששגיאות תחביר הן הסוג הכי קל לתיקון: הכלי אומר לכם שמשהו לא בסדר, ובערך איפה. הסוגים הקשים יותר מגיעים אחר כך, כשהקוד רץ.
לאן ממשיכים מכאן
תוכנית שעוברת את ה-parser עדיין יכולה לקרוס בזמן הריצה, וזו שגיאת זמן ריצה. לתוכנית שרצה עד הסוף אבל מדפיסה תשובה שגויה יש שגיאה לוגית, והדף ההוא משווה את שלושת הסוגים בטבלה אחת. לכללי הדקדוק עצמם, קראו על התחביר של Python או התחביר של C, ותרגלו אותם בקורס Python.
שאלות נפוצות
מה דוגמה לשגיאת תחביר?
print("Hello" היא שגיאת תחביר, וכך גם שורת if בלי נקודתיים ב-Python: if x > 3. ב-C וב-Java, נקודה-פסיק חסרה בסוף פקודה היא השגיאה הנפוצה ביותר. בכל המקרים הקוד לא עומד בדקדוק, ולכן הוא לא יכול לרוץ.מה ההבדל בין שגיאת תחביר לשגיאה סמנטית?
int ב-Java, ואחרים משתמשים בו כשם נוסף לשגיאה לוגית.מה זה שגיאת תחביר ב-C?
gcc ו-clang מדפיסים את הקובץ, השורה והעמודה, למשל main.c:4:18: error: expected ';' at end of declaration, ולא מייצרים קובץ הרצה עד שכל השגיאות מתוקנות.למה Python לא מתקן שגיאות תחביר אוטומטית?
Did you mean print(...)?, אבל משאיר את ההחלטה לכם.מה המשמעות של syntax error במחשבון?
ERR:SYNTAX.