我已经完成了为我的系统编程类编写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?
答案 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();