Frage

Ich habe ziemlich fertig mit dem Codieren eines SIC -Assemblers für meinen Systemprogrammierkurs, aber ich bin über den Tokenisierungsteil verblüfft.

Nehmen Sie beispielsweise diese Quellcodezeile:

Das Format (freies Format) lautet: {Label} opcode {operand {, x}} {comment}

Die Locken zeigen an, dass das Feld optional ist.

Außerdem muss jedes Feld durch mindestens einen Speicherplatz oder eine Registerkarte getrennt werden.

ENDFIL      LDA     EOF         COMMENT GOES HERE

Der obige Code ist etwas einfacher zu organisieren, aber das folgende Snippet gibt mir Schwierigkeiten.

        RSUB                COMMENT GOES HERE

Mein Code wird im ersten Wort des Kommentars gelesen, als wäre es ein Operand.

Hier ist mein Code:

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

Mein Professor verlangt, dass der Assembler mit zwei Versionen des Quellcodes getestet wird-einer mit Fehlern und einer ohne.

Der RSUB -Opcode ist nicht von einem Operanden abhängig, daher verstehe ich, dass alles nach dem RSUB -Opcode als Kommentar betrachtet werden kann. Wenn der fehlerhafte Quellcode jedoch einen Wert im Feld Operand enthält oder ob ein Opcode, der von einem Operanden abhängig ist Der Operand -Wert, wie kompensiere ich das? Ich muss diese als Fehler markieren und den fehlerhaften Operandenwert (oder den Mangel) ausdrucken.

Meine Frage ist: Wie verhindern Sie, dass der Kommentarbereich des Code als Operandin angesehen wird?

War es hilfreich?

Lösung

In den Versammlungssprachen (wie in anderen Programmiersprachen, die ich gesehen habe, gibt es einen Trennzeichen, der einen Kommentar markiert: Zum Beispiel ein Semikolon vor dem Kommentar:

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

Können Sie jedoch in Ihrer Syntax feststellen, ob etwas ein Kommentar von der Menge an Whitespace ist, die es in der Leitung vorausgeht, z. B. durch die Tatsache, dass es zwei (nicht nur eine) Whitespace -Ereignisse zwischen dem Opcode und dem Kommentar gibt?

{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT}

Andere Tipps

Wie können Sie feststellen, ob Text in einer bestimmten Zeile ein Operand oder ein Kommentar ist? Basiert es auf dem Kontext? Wenn der Opcode beispielsweise "RSUB" ist, würden Sie wissen, dass kein Operand erforderlich ist? Dann sollten Sie auf dem Operanden etwas Magie ausführen, basierend auf dem, was Opcode gelesen wird:

if (OPCODE == "RSUB") OPERAND.clear();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top