سؤال

لقد انتهيت إلى حد كبير ترميز مجمع 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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top