Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ما هو الخطأ في الصياغة (Syntax Error)؟

الخطأ في الصياغة (syntax error) هو خلل في بنية الكود، مثل نقطتين رأسيتين أو قوس أو علامة تنصيص ناقصة، يخالف القواعد النحوية للغة البرمجة. يرفض المترجم أو المفسر البرنامج قبل أن يُنفَّذ أي جزء منه.

بقلم Kevin Spektor, شريك مؤسس ورئيس قسم التكنولوجيا (CTO)

آخر تحديث 24 سبتمبر 2026

قبل أن تُنفّذ بايثون سطرًا واحدًا من برنامجك، تقرأ الملف كله وتتحقق من أنه يتبع القواعد النحوية للغة. إذا خالف سطر واحد تلك القواعد، فلن يُنفَّذ شيء على الإطلاق. شغّل هذا البرنامج ولاحظ ما لا يحدث: أول print لا يطبع شيئًا.

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

السطر 1 صحيح تمامًا، ومع ذلك لا تظهر عبارة "Checking the temperature" في المخرجات. رفضت بايثون الملف كاملًا لأن سطر if يجب أن ينتهي بنقطتين رأسيتين. أضف : بعد 30، وشغّل البرنامج مرة أخرى، فيُطبع السطران.

كيف يُكتشف الخطأ في الصياغة

لكل لغة برمجة قواعد نحوية: ما الكلمات المسموح بها، وأين تُفتح الأقواس وتُغلق، وما الذي يجب أن يأتي بعد if. البرنامج الذي يتحقق منها يسمى المحلل النحوي (parser)، ويعمل في المرحلة الأولى من تحويل الكود المصدري إلى شيء يمكن للآلة تنفيذه.

  1. يقسّم المُقطِّع (tokenizer) النص إلى وحدات (tokens): if وtemperature و> و30 وهكذا.
  2. يقرأ المحلل النحوي الوحدات بالترتيب ويطابقها مع القواعد. بعد if temperature > 30 يتوقع :، لكنه يجد نهاية السطر.
  3. يتوقف ويُبلغ عن الموضع الذي عجز عنده: اسم الملف ورقم السطر وعلامة (^) تحت الموضع.
  4. بما أن التحليل فشل، لا يُولَّد أي كود، فلا يُنفَّذ أي سطر من البرنامج.

في CPython يعمل المحلل النحوي في كل مرة تشغّل فيها سكربتًا. أما في اللغات التي لها مرحلة بناء منفصلة، فإن المترجم هو من يقوم بهذا الفحص: يرفض gcc وclang وjavac إنتاج البرنامج ما دام فيه خطأ صياغة واحد. لهذا تُعدّ أخطاء الصياغة من أخطاء وقت الترجمة، على عكس خطأ وقت التشغيل الذي يقع والبرنامج يعمل بالفعل.

أشهر أخطاء الصياغة في بايثون

هذه هي الأخطاء التي تقف وراء معظم أخطاء الصياغة التي يراها المبتدئون، مع الرسالة التي تطبعها بايثون 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(...)?بايثون 3 تتطلب print(...)
if a > 0 && b > 0:SyntaxError: invalid syntaxبايثون تستخدم and وor وnot
سطر if لا يليه سطر مُزاحIndentationError: expected an indented block after 'if' statement on line 1أزِح جسم الشرط بأربع مسافات

IndentationError نوع من SyntaxError: فالإزاحة في بايثون جزء من القواعد النحوية.

ليس كل خطأ مطبعي خطأً في الصياغة. pritn("hello") يتبع القواعد النحوية تمامًا، لأن اسمًا يليه قوسان هو استدعاء دالة. لا تكتشف بايثون أنه لا توجد دالة اسمها pritn إلا عندما تصل إلى ذلك السطر، وعندها ترفع NameError: name 'pritn' is not defined. Did you mean: 'print'?. هذا خطأ وقت تشغيل، والأسطر التي قبله تكون قد نُفّذت بالفعل.

لماذا قد يكون السطر المُبلَّغ عنه خاطئًا

يُبلغ المحلل النحوي عن النقطة التي لم يعد قادرًا عندها على المتابعة، وليست هي دائمًا النقطة التي وقع فيها الخطأ. القوس غير المغلق هو المثال الكلاسيكي: لا يمكن للمحلل أن يعرف أن القوس لم يُغلق حتى يتجاوز الموضع الذي كان يجب أن يُغلق فيه.

  File "main.py", line 1
    prices = [4.50, 3.20, 7.80
             ^
SyntaxError: '[' was never closed

تشير بايثون 3.10 وما بعدها إلى القوس الافتتاحي [ في السطر 1. أما بايثون 3.9 وما قبلها فكانت تُبلغ فقط عن invalid syntax في السطر 2، أي السطر الذي يلي الخطأ الحقيقي. لذا إذا بدا السطر المُبلَّغ عنه صحيحًا، فافحص نهاية السطر الذي فوقه.

المحللات النحوية الأخرى تتصرف بالطريقة نفسها. في الاستعلام SELECT name FORM users; حيث كُتبت FROM خطأً، يقرأ SQLite كلمة FORM على أنها اسم مستعار (اسم ثانٍ) للعمود name، ولا يفشل إلا بعد كلمة واحدة:

Parse error near line 1: near "users": syntax error
  SELECT name FORM users;
                   ^--- error here

أخطاء الصياغة في C وجافا وجافا سكريبت

اللغات المُترجَمة تُبلغ عن أخطاء الصياغة عند البناء، لا عند التشغيل. هذا تصريح بلا فاصلة منقوطة، مُترجَم باستخدام 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 عن الخطأ نفسه في جافا بصيغة error: ';' expected، ولا يُكتب أي ملف .class. وفي لغة C، قد يُنتج قوس معقوف واحد ناقص عشرات الأخطاء في ما يلي من الملف. أصلح الخطأ الأول ثم ترجم من جديد، لأن الأخطاء الأخرى تكون غالبًا نتيجة له.

محركات جافا سكريبت مثل V8 تحلل السكربت كاملًا قبل تشغيله، تمامًا مثل بايثون. يرفض Node.js هذا الملف قبل أن يطبع "start":

console.log("start");
if (x > 1 {
  console.log("big");
}
SyntaxError: Unexpected token '{'

في المتصفح، يوقف خطأ الصياغة تشغيل ملف السكربت ذاك وحده، بينما تستمر السكربتات الأخرى في الصفحة بالعمل.

كيف تصلح خطأ الصياغة

  1. اقرأ السطر الأخير من الرسالة أولًا. فهو يسمّي المشكلة: : ناقصة، أو ( غير مغلق، أو وحدة غير متوقعة.
  2. اذهب إلى السطر المُبلَّغ عنه وانظر إلى العلامة ^. إن بدا السطر سليمًا، فافحص السطر الذي فوقه.
  3. تحقق من الأزواج. كل ( و[ و{ وعلامة تنصيص تحتاج إلى نظير. تُبرز معظم المحررات القوس المقابل عندما يكون المؤشر بجوار قوس.
  4. تحقق من علامات الترقيم التي تتطلبها اللغة: النقطتان الرأسيتان والإزاحة في بايثون، والفواصل المنقوطة والأقواس المعقوفة في C وجافا وجافا سكريبت.
  5. أصلح الخطأ الأول فقط، ثم شغّل البرنامج من جديد. فالرسائل اللاحقة غالبًا ما يسببها الخطأ الأول.
  6. راقب تلوين الصياغة. بعد علامة تنصيص غير مغلقة، يتحول باقي الملف عادةً إلى لون النصوص، فيُظهر لك أين بدأت المشكلة.

والخبر الجيد أن أخطاء الصياغة هي الأسهل إصلاحًا: فالأداة تخبرك بأن شيئًا ما خاطئ وبموضعه تقريبًا. أما الأنواع الأصعب فتأتي لاحقًا، عندما يعمل الكود.

إلى أين بعد ذلك

البرنامج الذي يجتاز المحلل النحوي قد يتعطل مع ذلك أثناء تشغيله، وهذا خطأ وقت التشغيل. والبرنامج الذي يعمل حتى النهاية لكنه يطبع إجابة خاطئة فيه خطأ منطقي، وتقارن تلك الصفحة الأنواع الثلاثة في جدول واحد. أما القواعد النحوية نفسها فاقرأ عنها في صياغة بايثون أو صياغة لغة C، وتدرّب عليها في دورة بايثون.

الأسئلة الشائعة

ما هو مثال على خطأ في الصياغة؟
حذف القوس الختامي في print("Hello" خطأ في الصياغة، وكذلك سطر if بلا نقطتين رأسيتين في بايثون: if x > 3. وفي لغة C وجافا، أكثر هذه الأخطاء شيوعًا هو نسيان الفاصلة المنقوطة في نهاية العبارة. في كل الحالات لا يتبع الكود القواعد النحوية، فلا يمكن تشغيله.
ما الفرق بين خطأ الصياغة والخطأ الدلالي (semantic error)؟
خطأ الصياغة يخالف القواعد النحوية، فلا يمكن حتى تحليل الكود. أما الخطأ الدلالي فهو كود سليم نحويًا لكن معناه خاطئ. بعض الكتب تستخدم هذا المصطلح لأخطاء الأنواع التي يرفضها المترجم، مثل إسناد نص إلى متغير من نوع int في جافا، وبعضها يستخدمه اسمًا آخر للخطأ المنطقي.
ما هو خطأ الصياغة في لغة C؟
في لغة C هو كود لا يستطيع المترجم تحليله، وغالبًا ما يكون فاصلة منقوطة ناقصة أو قوسًا معقوفًا بلا نظير أو كلمة محجوزة مكتوبة خطأً. يطبع gcc وclang اسم الملف والسطر والعمود، مثل main.c:4:18: error: expected ';' at end of declaration، ولا يُنتجان ملفًا تنفيذيًا حتى تُصلح كل الأخطاء.
لماذا لا تصلح بايثون أخطاء الصياغة تلقائيًا؟
لأن أغلب أخطاء الصياغة لها أكثر من إصلاح ممكن، والتخمين الخاطئ سيغيّر معنى البرنامج. فالقوس غير المغلق قد يكون مقصودًا إغلاقه بعد العنصر الأول أو بعد العاشر. تقترح بايثون الحديثة إصلاحًا محتملًا، مثل Did you mean print(...)?، لكنها تترك القرار لك.
ماذا تعني رسالة syntax error على الآلة الحاسبة؟
تعني الشيء نفسه كما في الكود: التعبير الذي كتبته لا يتبع قواعد الآلة الحاسبة، فلا يمكن حسابه. من أسبابها المعتادة قوس غير مغلق، أو عمليتان متتاليتان، أو استخدام زر الطرح في موضع يتطلب إشارة السالب. فالآلة TI-84 مثلًا تعرض ERR:SYNTAX.
Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن