对SIC汇编器源进行标记

时间:2009-05-26 03:51:29

标签: c++ tokenize

我已经完成了为我的系统编程类编写SIC汇编程序的代码,但我对标记化部分感到难过。

例如,请使用以下源代码:

格式(免费格式)为:{LABEL}操作码{OPERAND {,X}} {评论}

卷发表明该字段是可选的。

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

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

我的教授要求使用两个版本的源代码测试汇编程序 - 一个有错误,一个没有。

RSUB OPCODE不依赖于OPERAND,所以我理解RSUB OPCODE之后的所有内容都可以被认为是注释,但是如果错误的源代码在OPERAND字段中包含一个值,或者如果一个OPCODE依赖于一个值。 OPERAND缺少OPERAND值,我该如何补偿?我需要将这些标记为错误并打印出错误的OPERAND值(或缺少它)。

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

2 个答案:

答案 0 :(得分:-1)

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

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

然而,在你的语法中,你能否通过行前面的空白量来判断某些东西是否是评论,例如:事实上,操作码和评论之间有两个(不仅仅是一个)空白事件?

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

答案 1 :(得分:-1)

如何辨别某一行中的文字是操作数还是注释?它是基于背景吗?例如,如果OPCODE是“RSUB”,那么您会知道不需要OPERAND吗?那么你应该根据读取的OPCODE在OPERAND上执行一些魔术:

if (OPCODE == "RSUB") OPERAND.clear();
相关问题