Skip to content

قراءةُ رسالةِ خطأٍ من المترجِّم

هدفُك: أن تقرأَ ما رفضَه المترجِّمُ فتعرفَ ماذا تُصلِحُ — بلا تخمين.

كلُّ رسالةٍ من المترجِّمِ رمزٌ من كتالوجٍ مُعلَن (١٩١ رمزًا في language-truth/errors/)، لا نصٌّ حرٌّ ألَّفَه أحد. والرمزُ هو ما تبحثُ به.


الشكلُ الأوّل — تشخيصٌ دلاليٌّ في سطرَين

اكتُبْ هذا عمدًا:

sad
متغير س = 5
اطبع_سطر(ص)

فيرفضُ المترجِّمُ برمزِ خروجٍ 1 ويطبع:

برنامج.ص: error: [SEM001] (AR) المتغير 'ص' غير معرَّف
  → عرّف المتغير قبل استخدامه: متغير ص = <قيمة>
1 error(s) generated.

اقرأْه أربعَ قطع:

القطعةمثالُهاما تقول
الملفّبرنامج.صأينَ المشكلة
الرمز[SEM001]معرّفُ القاعدةِ في الكتالوج
اللغة والوصف(AR) المتغير 'ص' غير معرَّفماذا حدث
سطرُ عرّف المتغير قبل استخدامه…العلاجُ المُعلَن

سطرُ ليس زينةً: هو حقلُ fix_hint في مصدرِ الحقيقة، مكتوبٌ مع الرمزِ نفسِه. فابدأْ منه.

السطرُ الأخيرُ عدَّاد

1 error(s) generated. يقولُ كم خطأً جُمِعَ في هذه الترجمة. والمترجِّمُ يُكمِلُ بعدَ الخطأِ الأوّلِ ليجمعَ ما بعدَه — فأصلِحْ من أعلى القائمة.


الشكلُ الثاني — تشخيصٌ نحويٌّ ثنائيُّ اللغة

الأخطاءُ النحويّةُ (SYN…) تُطبَعُ في كتلةٍ أوسعَ فيها الموقعُ والرمزُ الحاليّ. احذفْ نهاية من كتلةِ شرطٍ:

sad
إذا (1 > 0)
    اطبع_سطر("ن")
⛔ [SYN013] الكتلة لم تُغلَق — توقعت 'نهاية'
   💡 أضف 'نهاية' لإغلاق الكتلة قبل متابعة بقية الكود.
   📍 الموقع: السطر 3، العمود 1
   🔎 الرمز الحالي: <نهاية الملف>

📍 هو الموضع، و🔎 هو الرمزُ الذي وقفَ عندَه المحلِّل. وحينَ يكونُ <نهاية الملف> فالغالبُ أنّ كتلةً بقيت مفتوحة.

الخطأُ الثاني قد يكونُ ظلَّ الأوّل

في المثالِ نفسِه طُبِعَ بعدَه [SYN003] Expected 'نهاية' here وتحتَه This error follows a previous syntax error. هذا السطرُ يُصرِّحُ بأنّ الخطأَ تابعٌ لما قبلَه. أصلِحِ الأوّلَ وأعِدِ الترجمة، ولا تُطارِدْ التوابع.


الشكلُ الثالث — خطأٌ زمنيٌّ بعدَ ترجمةٍ ناجحة

بعضُ الأخطاءِ لا يراها المترجِّم. هذا يُترجَمُ بنجاحٍ ثمّ يُخفِقُ عندَ التشغيل:

sad
متغير م = [1، 2، 3]
اطبع_سطر(م[10])
[RUN002] الفهرس 10 خارج نطاق مصفوفة (الطول 3)

ورمزُ خروجِ البرنامجِ 1. والرمزُ RUN… من الكتالوجِ نفسِه — تقرأُه كما تقرأُ SEM….

فرِّقْ بينَ الطَّبَقتَين

رسالةٌ ظهرت من sad-build ⇒ خطأُ ترجمة، ولا ملفَّ تنفيذيَّ يخرج. رسالةٌ ظهرت من ./برنامجي.exe ⇒ خطأُ تشغيل، والترجمةُ نجحت.


استزِدْ من الشرح — --اشرح

الرسالةُ الموجزةُ لا تكفي أحيانًا. العَلَمُ --اشرح يُبدِّلُها بالشرحِ المفصَّلِ من الكتالوج:

bash
sad-build برنامج.ص --اشرح -o برنامج.exe
برنامج.ص: error: [SEM001] (AR) لغة ص تتطلّب تعريف كل متغيّر بـ'متغير' أو 'ثابت' قبل الاستخدام. هذا الخطأ يحدث عند الإشارة لاسم لم يُعرَّف في النطاق الحالي ولا في النطاقات الأعلى. غالباً يكون السبب خطأً إملائياً أو نسيان التعريف.
  → عرّف المتغير قبل استخدامه: متغير ص = <قيمة>

وبالإنجليزيّةِ إن شئت:

bash
sad-build برنامج.ص --لغة=en -o برنامج.exe
برنامج.ص: error: [SEM001] 
(EN) Variable 'ص' is not defined
  → Declare the variable before use: متغير ص = <value>

أربعةُ رموزٍ سيراها المبتدئُ أوّلًا

الرمزمتىالعلاج
SEM001اسمٌ لم يُعرَّفْ — أو خطأٌ إملائيٌّ في اسمٍ معرَّفعرِّفْه بـمتغير أو صحِّحِ الإملاء
SEM004استدعاءُ دالّةٍ غيرِ معرَّفةعرِّفِ الدالّةَ أو استورِدْ وحدتَها
SEM007إسنادٌ إلى ثابتاجعلْه متغير، أو احذفِ الإسناد
SYN013كتلةٌ لم تُغلَقْ بـنهايةأضِفْ نهاية

السكوتُ ليس براءة

مقيسٌ اليوم: تكرارُ متغير س مرّتَينِ في النطاقِ نفسِه يُقبَل، ودالّةٌ بمعاملَينِ استُدعيت بوسيطٍ واحدٍ تُقبَل، وإسنادُ نصٍّ إلى متغيّرٍ مُعلَنِ النوعِ رقم يُقبَل. فالكتالوجُ يُعلِنُ رموزًا لهذه الحالاتِ ولا يبعثُها المترجِّمُ افتراضيًّا. غيابُ الرسالةِ لا يُثبِتُ صحّةَ البرنامج.


ثمّ

مُرخَّص بموجب رخصة MIT