我已经为我的系统编程类编写了一个 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 值,我该如何补偿?我需要将这些标记为错误并打印出错误的操作数值(或缺少)。
我的问题是:如何防止代码的注释部分被视为操作数?