3

システム プログラミング クラス用の SIC アセンブラーのコーディングはほぼ完了しましたが、トークン化の部分で困惑しています。

たとえば、次のソース コード行を見てください。

形式 (自由形式) は次のとおりです。 {LABEL} OPCODE {OPERAND{,X}} {COMMENT}

カールは、フィールドがオプションであることを示します。

また、各フィールドは少なくとも 1 つのスペースまたはタブで区切る必要があります。

ENDFIL      LDA     EOF         COMMENT GOES HERE

上記のコードは整理するのが少し簡単ですが、次のスニペットが問題を引き起こしています。

        RSUB                COMMENT GOES HERE

私のコードは、コメントの最初の単語を OPERAND であるかのように読み取ります。

これが私のコードです:

//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("");
    }

私の教授は、アセンブラを 2 つのバージョンのソース コード (エラーのあるバージョンとないバージョン) でテストするように要求しています。

RSUB OPCODE は OPERAND に依存していないため、RSUB OPCODE の後のすべてがコメントと見なされることは理解していますが、誤ったソース コードの OPERAND フィールドに値が含まれている場合、または OPERAND に依存する OPCODE が欠落している場合OPERAND 値、どうすればこれを補正できますか? これらにエラーとしてフラグを立て、誤った OPERAND 値 (またはその欠如) を出力する必要があります。

私の質問は、コードのコメント部分がオペランドと見なされないようにするにはどうすればよいですか?

4

2 に答える 2

-1

私が見たアセンブリ言語 (他のプログラミング言語と同様) には、コメントをマークする区切り文字があります。たとえば、コメントの前にセミコロンがあります。

ENDFIL LDA EOF ;COMMENT GOES HERE
RSUB ;ANOTHER COMMENT GOES HERE

しかし、あなたの構文では、行の前にある空白の量によって何かがコメントであるかどうかを判断できますか? たとえば、オペコードとコメントの間に 2 つの (1 つだけでなく) 空白イベントがあるという事実によって?

{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT}
于 2009-05-26T04:04:10.597 に答える
-1

特定の行のテキストがオペランドかコメントかをどのように判断できますか? それは文脈に基づいていますか?たとえば、OPCODE が「RSUB」の場合、OPERAND は不要であることがわかりますか? 次に、読み取った OPCODE に基づいて、OPERAND でいくつかの魔法を実行する必要があります。

if (OPCODE == "RSUB") OPERAND.clear();
于 2009-05-26T04:06:12.517 に答える