سؤال
لقد انتهيت إلى حد كبير ترميز مجمع SIC للحصول على فئة برمجة أنظمتي، لكنني أحظت في الجزء المميز.
على سبيل المثال، خذ هذا الخط من التعليمات البرمجية المصدرية:
التنسيق (تنسيق مجاني) هو: {label} opcode {operand {، x}} {تعليق}
تشير الضفائر إلى أن الحقل اختياري.
أيضا، يجب فصل كل حقل عن طريق مساحة أو علامة تبويب واحدة على الأقل.
ENDFIL LDA EOF COMMENT GOES HERE
الكود أعلاه أسهل بعض الشيء في التنظيم ولكن المقتطف التالي يعطيني صعوبات.
RSUB COMMENT GOES HERE
سوف يقرأ الرمز الخاص بي في الكلمة الأولى للتعليق كما لو كانت معوما.
هنا هو رمزي:
//tokenize line
if(currentLine[0] != ' ' && currentLine[0] != '\t')
{
stringstream stream(currentLine);
stream >> LABEL;
stream >> OPCODE;
stream >> OPERAND;
stream.str("");
if(LABEL.length() > 6 || isdigit(LABEL[0]) || !alphaNum(LABEL))
{
errors[1] = 1;
}
else if(LABEL.length() == currentLine.length())
{
justLabel = true;
errors[6] = 1;
return;
}
}
else
{
stringstream stream(currentLine);
stream >> OPCODE;
stream >> OPERAND;
stream.str("");
}
يتطلب أستاذي أن يتم اختبار المجمع مع نسختين من شفرة المصدر - واحد مع الأخطاء وواحد دون.
لا تعتمد RSUB OPCODE على المعامل حتى أفهم أن كل شيء بعد أن تعتبر Opcode RSUB تعليقا، ولكن إذا كان التعليمات البرمجية المصدر الخاطئة تحتوي على قيمة في حقل المعامل أو إذا كان Opcode الذي يعتمد على المعامل مفقود قيمة المعامل، كيف يمكنني التعويض عن هذا؟ أحتاج إلى العلم هذه كأخطاء وطباعة قيمة المعامل الخاطئة (أو عدم وجودها).
سؤالي هو: كيف يمكنني منع جزء التعليق من التعليمات البرمجية من التعبير عن المعامل؟
المحلول
في لغات التجميع (كما هو الحال في لغات البرمجة الأخرى) التي رأيتها، هناك محدد يمثل تعليقا: على سبيل المثال فاصلة منقوطة قبل التعليق:
ENDFIL LDA EOF ;COMMENT GOES HERE
RSUB ;ANOTHER COMMENT GOES HERE
ومع ذلك، في بناء الجملة، هل يمكنك معرفة ما إذا كان هناك شيء ما تعليق بمقدار المسافة المسبقة التي تسبقها على الخط، على سبيل المثال من خلال أحداث مستويات بيضاء (وليس واحدة فقط) بين Opcode والتعليق؟
{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT}
نصائح أخرى
كيف يمكنك معرفة ما إذا كان النص في سطر معين هو معامل أو تعليق؟ هل تستند إلى السياق؟ على سبيل المثال، إذا كان Opcode هو "RSUB"، فأنت تعرف أنه لا يوجد معامل مطلوب؟ ثم يجب عليك القيام ببعض السحر على المعامل بناء على قراءة OPCode:
if (OPCODE == "RSUB") OPERAND.clear();