我几乎完成了为系统编程课程编码的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不依赖操作数,因此我了解RSUB OPCODE之后的所有内容都可以视为评论,但是如果错误的源代码包含操作数字段中的值操作数的价值,我该如何弥补这一点?我需要将这些标记为错误,并打印出错误的操作数值(或缺乏)。

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

有帮助吗?

解决方案

在我看过的汇编语言(如其他编程语言)中,有一个定界符标记了一个评论:例如,在评论之前是半彩:

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

但是,在您的语法中,您能说出某事是在列在线之前的whitespace数量的评论,例如,opcode和评论之间存在两个(不仅仅是一个)空间事件的事实?

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

其他提示

您如何判断一行中的文本是操作数还是评论?是基于上下文吗?例如,如果操作码为“ rsub”,那么您将知道不需要操作数吗?然后,您应该根据读取内容在操作数上执行一些魔术:

if (OPCODE == "RSUB") OPERAND.clear();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top