ما هو الخطأ في الصياغة (Syntax Error)؟
الخطأ في الصياغة (syntax error) هو خلل في بنية الكود، مثل نقطتين رأسيتين أو قوس أو علامة تنصيص ناقصة، يخالف القواعد النحوية للغة البرمجة. يرفض المترجم أو المفسر البرنامج قبل أن يُنفَّذ أي جزء منه.
آخر تحديث 24 سبتمبر 2026
قبل أن تُنفّذ بايثون سطرًا واحدًا من برنامجك، تقرأ الملف كله وتتحقق من أنه يتبع القواعد النحوية للغة. إذا خالف سطر واحد تلك القواعد، فلن يُنفَّذ شيء على الإطلاق. شغّل هذا البرنامج ولاحظ ما لا يحدث: أول print لا يطبع شيئًا.
File "main.py", line 4
if temperature > 30
^
SyntaxError: expected ':'
السطر 1 صحيح تمامًا، ومع ذلك لا تظهر عبارة "Checking the temperature" في المخرجات. رفضت بايثون الملف كاملًا لأن سطر if يجب أن ينتهي بنقطتين رأسيتين. أضف : بعد 30، وشغّل البرنامج مرة أخرى، فيُطبع السطران.
كيف يُكتشف الخطأ في الصياغة
لكل لغة برمجة قواعد نحوية: ما الكلمات المسموح بها، وأين تُفتح الأقواس وتُغلق، وما الذي يجب أن يأتي بعد if. البرنامج الذي يتحقق منها يسمى المحلل النحوي (parser)، ويعمل في المرحلة الأولى من تحويل الكود المصدري إلى شيء يمكن للآلة تنفيذه.
- يقسّم المُقطِّع (tokenizer) النص إلى وحدات (tokens):
ifوtemperatureو>و30وهكذا. - يقرأ المحلل النحوي الوحدات بالترتيب ويطابقها مع القواعد. بعد
if temperature > 30يتوقع:، لكنه يجد نهاية السطر. - يتوقف ويُبلغ عن الموضع الذي عجز عنده: اسم الملف ورقم السطر وعلامة (
^) تحت الموضع. - بما أن التحليل فشل، لا يُولَّد أي كود، فلا يُنفَّذ أي سطر من البرنامج.
في CPython يعمل المحلل النحوي في كل مرة تشغّل فيها سكربتًا. أما في اللغات التي لها مرحلة بناء منفصلة، فإن المترجم هو من يقوم بهذا الفحص: يرفض gcc وclang وjavac إنتاج البرنامج ما دام فيه خطأ صياغة واحد. لهذا تُعدّ أخطاء الصياغة من أخطاء وقت الترجمة، على عكس خطأ وقت التشغيل الذي يقع والبرنامج يعمل بالفعل.
أشهر أخطاء الصياغة في بايثون
هذه هي الأخطاء التي تقف وراء معظم أخطاء الصياغة التي يراها المبتدئون، مع الرسالة التي تطبعها بايثون 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(...)? | بايثون 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 '{'
في المتصفح، يوقف خطأ الصياغة تشغيل ملف السكربت ذاك وحده، بينما تستمر السكربتات الأخرى في الصفحة بالعمل.
كيف تصلح خطأ الصياغة
- اقرأ السطر الأخير من الرسالة أولًا. فهو يسمّي المشكلة:
:ناقصة، أو(غير مغلق، أو وحدة غير متوقعة. - اذهب إلى السطر المُبلَّغ عنه وانظر إلى العلامة
^. إن بدا السطر سليمًا، فافحص السطر الذي فوقه. - تحقق من الأزواج. كل
(و[و{وعلامة تنصيص تحتاج إلى نظير. تُبرز معظم المحررات القوس المقابل عندما يكون المؤشر بجوار قوس. - تحقق من علامات الترقيم التي تتطلبها اللغة: النقطتان الرأسيتان والإزاحة في بايثون، والفواصل المنقوطة والأقواس المعقوفة في C وجافا وجافا سكريبت.
- أصلح الخطأ الأول فقط، ثم شغّل البرنامج من جديد. فالرسائل اللاحقة غالبًا ما يسببها الخطأ الأول.
- راقب تلوين الصياغة. بعد علامة تنصيص غير مغلقة، يتحول باقي الملف عادةً إلى لون النصوص، فيُظهر لك أين بدأت المشكلة.
والخبر الجيد أن أخطاء الصياغة هي الأسهل إصلاحًا: فالأداة تخبرك بأن شيئًا ما خاطئ وبموضعه تقريبًا. أما الأنواع الأصعب فتأتي لاحقًا، عندما يعمل الكود.
إلى أين بعد ذلك
البرنامج الذي يجتاز المحلل النحوي قد يتعطل مع ذلك أثناء تشغيله، وهذا خطأ وقت التشغيل. والبرنامج الذي يعمل حتى النهاية لكنه يطبع إجابة خاطئة فيه خطأ منطقي، وتقارن تلك الصفحة الأنواع الثلاثة في جدول واحد. أما القواعد النحوية نفسها فاقرأ عنها في صياغة بايثون أو صياغة لغة C، وتدرّب عليها في دورة بايثون.
الأسئلة الشائعة
ما هو مثال على خطأ في الصياغة؟
print("Hello" خطأ في الصياغة، وكذلك سطر if بلا نقطتين رأسيتين في بايثون: if x > 3. وفي لغة C وجافا، أكثر هذه الأخطاء شيوعًا هو نسيان الفاصلة المنقوطة في نهاية العبارة. في كل الحالات لا يتبع الكود القواعد النحوية، فلا يمكن تشغيله.ما الفرق بين خطأ الصياغة والخطأ الدلالي (semantic error)؟
int في جافا، وبعضها يستخدمه اسمًا آخر للخطأ المنطقي.ما هو خطأ الصياغة في لغة C؟
gcc وclang اسم الملف والسطر والعمود، مثل main.c:4:18: error: expected ';' at end of declaration، ولا يُنتجان ملفًا تنفيذيًا حتى تُصلح كل الأخطاء.لماذا لا تصلح بايثون أخطاء الصياغة تلقائيًا؟
Did you mean print(...)?، لكنها تترك القرار لك.ماذا تعني رسالة syntax error على الآلة الحاسبة؟
ERR:SYNTAX.