gpt4 book ai didi

c++ - 标记 SIC 汇编程序源代码

转载 作者:太空狗 更新时间:2023-10-29 23:20:55 31 4
gpt4 key购买 nike

我几乎已经为我的系统编程类(class)完成了 SIC 汇编程序的编码,但我在标记化部分遇到了困难。

例如,拿这行源码来说:

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

curl 表示该字段是可选的。

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

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 字段中包含一个值,或者如果 OPCODE 依赖于OPERAND 缺少 OPERAND 值,我该如何补偿?我需要将这些标记为错误并打印出错误的 OPERAND 值(或缺少)。

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

最佳答案

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

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

然而,在你的语法中,你能否通过行中它前面的空格数量来判断某物是否是注释,例如是因为在操作码和注释之间有两个(不仅仅是一个)空白事件吗?

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

关于c++ - 标记 SIC 汇编程序源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/908847/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com