Pregunta

He terminado de codificar un ensamblador SIC para mi clase de programación de sistemas, pero estoy perplejo en la parte de la tokenización.

Por ejemplo, tome esta línea de código fuente:

El formato (Free Format) es: {etiqueta} opcode {operand {, x}} {comentario}

Los rizos indican que el campo es opcional.

Además, cada campo debe estar separado por al menos un espacio o pestaña.

ENDFIL      LDA     EOF         COMMENT GOES HERE

El código anterior es un poco más fácil de organizar, pero el siguiente fragmento me está dando dificultades.

        RSUB                COMMENT GOES HERE

Mi código se leerá en la primera palabra del comentario como si fuera un operando.

Aquí está mi código:

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

Mi profesor requiere que el ensamblador se pruebe con dos versiones del código fuente: una con errores y otra sin.

El código de operación RSUB no depende de un operando, por lo que entiendo que todo después del código de operación RSUB puede considerarse un comentario, pero si el código fuente erróneo contiene un valor en el campo de operando o si un código de operación que depende de un operando está faltando El valor del operando, ¿cómo compenso esto? Necesito marcar estos como errores e imprimir el valor de operando erróneo (o falta de él).

Mi pregunta es: ¿cómo evito que la parte de comentarios del código se considere un operando?

¿Fue útil?

Solución

En los lenguajes de ensamblaje (como en otros lenguajes de programación) que he visto, hay un delimitador que marca un comentario: por ejemplo, un semicolon antes del comentario:

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

Sin embargo, en su sintaxis, ¿puede saber si algo es un comentario por la cantidad de espacio en blanco que lo precede en la línea, por ejemplo, por el hecho de que hay dos (no solo uno) eventos en blanco entre el código de operación y el comentario?

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

Otros consejos

¿Cómo puede saber si el texto en una determinada línea es un operando o un comentario? ¿Se basa en el contexto? Por ejemplo, si el código de operación es "RSUB", ¿sabrá que no se requiere operando? Entonces debes realizar algo de magia en el operando en función de qué código de operación se lee:

if (OPCODE == "RSUB") OPERAND.clear();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top