3

我已经为我的系统编程类编写了一个 SIC 汇编器,但我对标记化部分感到困惑。

例如,以这行源代码为例:

格式(自由格式)为:{LABEL} OPCODE {OPERAND{,X}} {COMMENT}

卷曲表示该字段是可选的。

此外,每个字段必须由至少一个空格或制表符分隔。

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 不依赖于 OPERAND,因此我了解 RSUB OPCODE 之后的所有内容都可以视为注释,但是如果错误的源代码在 OPERAND 字段中包含值,或者缺少依赖于 OPERAND 的 OPCODE OPERAND 值,我该如何补偿?我需要将这些标记为错误并打印出错误的操作数值(或缺少)。

我的问题是:如何防止代码的注释部分被视为操作数?

4

2 回答 2

-1

在我见过的汇编语言(如其他编程语言)中,有一个标记注释的分隔符:例如注释前的分号:

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

但是,在您的语法中,您能否通过行前的空白数量来判断某事是否是评论,例如,通过操作码和评论之间有两个(不仅仅是一个)空白事件的事实?

{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 回答