Menu
Coddy logo textTech

מה זה Syntax Error (שגיאת תחביר)?

שגיאת תחביר (syntax error) היא טעות במבנה של הקוד, למשל נקודתיים, סוגריים או מירכאות חסרים, שמפרה את כללי הדקדוק של שפת התכנות. הקומפיילר או המפרש דוחים את התוכנית לפני שחלק כלשהו ממנה רץ.

מאת Kevin Spektor, מייסד שותף ו-CTO

עודכן ב-24 בספטמבר 2026

לפני ש-Python מריץ אפילו שורה אחת מהתוכנית שלכם, הוא קורא את כל הקובץ ובודק שהוא עומד בדקדוק של השפה. אם שורה אחת מפרה את הדקדוק הזה, שום דבר לא רץ. הריצו את התוכנית הזו ושימו לב למה שלא קורה: ה-print הראשון אף פעם לא מדפיס.

  File "main.py", line 4
    if temperature > 30
                       ^
SyntaxError: expected ':'

שורה 1 תקינה לגמרי, ובכל זאת "Checking the temperature" חסר בפלט. Python דחה את הקובץ כולו, כי שורת if חייבת להסתיים בנקודתיים. הוסיפו את ה-: אחרי 30, הריצו שוב, ושתי השורות יודפסו.

איך שגיאת תחביר מתגלה

לכל שפת תכנות יש דקדוק: אילו מילים מותרות, איפה סוגריים נפתחים ונסגרים, מה חייב לבוא אחרי if. התוכנית שבודקת אותו נקראת parser (מנתח תחבירי), והיא פועלת בשלב הראשון של הפיכת קוד מקור למשהו שמכונה יכולה להריץ.

  1. ה-tokenizer מפרק את הטקסט ליחידות (tokens): if, temperature, >, 30, וכן הלאה.
  2. ה-parser קורא את היחידות לפי הסדר ומתאים אותן לדקדוק. אחרי if temperature > 30 הוא מצפה ל-:, אבל הוא מוצא את סוף השורה.
  3. הוא עוצר ומדווח על המקום שבו הוא ויתר: הקובץ, מספר השורה, וסימן ^ (caret) מתחת למיקום.
  4. מכיוון שהניתוח נכשל, לא נוצר קוד, ולכן אף שורה בתוכנית לא רצה.

ב-CPython ה-parser רץ בכל פעם שמפעילים סקריפט. בשפות עם שלב בנייה נפרד, הקומפיילר מבצע את הבדיקה הזו: gcc, clang ו-javac מסרבים לייצר תוכנית כל עוד נשארה אפילו שגיאת תחביר אחת. בגלל זה שגיאות תחביר נחשבות לשגיאות זמן קומפילציה, בניגוד לשגיאת זמן ריצה, שקורית כשהתוכנית כבר רצה.

שגיאות תחביר נפוצות ב-Python

אלה הטעויות שעומדות מאחורי רוב שגיאות התחביר שמתחילים רואים, עם ההודעה המדויקת ש-Python 3.12 מדפיס.

קודהודעהתיקון
if x > 3SyntaxError: expected ':'סיימו שורות if, for, while, def ו-class ב-:
print("Hi"SyntaxError: '(' was never closedסגרו כל סוגר שאתם פותחים
name = "AdaSyntaxError: 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 syntaxPython משתמש ב-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 '{'

בדפדפן, שגיאת תחביר עוצרת רק את קובץ הסקריפט הזה, וסקריפטים אחרים בדף עדיין רצים.

איך מתקנים שגיאת תחביר

  1. קראו קודם את השורה האחרונה של ההודעה. היא מציינת את הבעיה: : חסרות, ( שלא נסגר, token לא צפוי.
  2. עברו לשורה המדווחת והסתכלו על ה-caret. אם השורה נראית תקינה, בדקו את השורה שמעליה.
  3. בדקו זוגות. כל (, [, { וכל מירכאות צריכים בן זוג. רוב העורכים מדגישים את הסוגר המתאים כשהסמן נמצא ליד אחד מהם.
  4. בדקו את סימני הפיסוק שהשפה דורשת: נקודתיים והזחה ב-Python, נקודה-פסיק וסוגריים מסולסלים ב-C, Java ו-JavaScript.
  5. תקנו רק את השגיאה הראשונה, ואז הריצו שוב. הודעות מאוחרות יותר נגרמות לעיתים קרובות מהראשונה.
  6. שימו לב להדגשת התחביר. אחרי מירכאות שלא נסגרו, שאר הקובץ בדרך כלל נצבע בצבע של מחרוזת, וזה מראה לכם איפה היא התחילה.

החדשות הטובות הן ששגיאות תחביר הן הסוג הכי קל לתיקון: הכלי אומר לכם שמשהו לא בסדר, ובערך איפה. הסוגים הקשים יותר מגיעים אחר כך, כשהקוד רץ.

לאן ממשיכים מכאן

תוכנית שעוברת את ה-parser עדיין יכולה לקרוס בזמן הריצה, וזו שגיאת זמן ריצה. לתוכנית שרצה עד הסוף אבל מדפיסה תשובה שגויה יש שגיאה לוגית, והדף ההוא משווה את שלושת הסוגים בטבלה אחת. לכללי הדקדוק עצמם, קראו על התחביר של Python או התחביר של C, ותרגלו אותם בקורס Python.

שאלות נפוצות

מה דוגמה לשגיאת תחביר?
השמטה של הסוגריים הסוגרים ב-print("Hello" היא שגיאת תחביר, וכך גם שורת if בלי נקודתיים ב-Python: if x > 3. ב-C וב-Java, נקודה-פסיק חסרה בסוף פקודה היא השגיאה הנפוצה ביותר. בכל המקרים הקוד לא עומד בדקדוק, ולכן הוא לא יכול לרוץ.
מה ההבדל בין שגיאת תחביר לשגיאה סמנטית?
שגיאת תחביר מפרה את הדקדוק, ולכן אי אפשר אפילו לנתח את הקוד. שגיאה סמנטית היא קוד תקין מבחינה דקדוקית שהמשמעות שלו שגויה. יש ספרים שמשתמשים במונח לשגיאות טיפוסים שקומפיילר דוחה, כמו השמה של טקסט ל-int ב-Java, ואחרים משתמשים בו כשם נוסף לשגיאה לוגית.
מה זה שגיאת תחביר ב-C?
ב-C זה קוד שהקומפיילר לא מצליח לנתח, לרוב נקודה-פסיק חסרה, סוגר מסולסל בלי בן זוג או מילת מפתח עם שגיאת כתיב. gcc ו-clang מדפיסים את הקובץ, השורה והעמודה, למשל main.c:4:18: error: expected ';' at end of declaration, ולא מייצרים קובץ הרצה עד שכל השגיאות מתוקנות.
למה Python לא מתקן שגיאות תחביר אוטומטית?
כי לרוב שגיאות התחביר יש יותר מתיקון אפשרי אחד, וניחוש שגוי ישנה את המשמעות של התוכנית. סוגר פתוח יכול היה להיסגר אחרי הפריט הראשון או אחרי העשירי. Python המודרני מציע תיקון סביר, כמו Did you mean print(...)?, אבל משאיר את ההחלטה לכם.
מה המשמעות של syntax error במחשבון?
אותה משמעות כמו בקוד: הביטוי שהקלדתם לא עומד בכללים של המחשבון, ולכן אי אפשר לחשב אותו. הסיבות הנפוצות הן סוגריים שלא נסגרו, שני אופרטורים ברצף, או שימוש במקש החיסור במקום שבו נדרש סימן שלילי. TI-84, למשל, מציג ERR:SYNTAX.
איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל