我几乎已经为我的系统编程类编写了一个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之后的所有内容都可以被视为注释,但是如果错误的源代码在操作数字段中包含一个值,或者如果依赖于操作数的OPCODE缺少操作数值,我该如何对此进行补偿?我需要将这些标记为错误,并打印出错误的操作数值(或缺少该值)。
我的问题是:如何防止代码的注释部分被视为操作数?
发布于 2009-05-26 04:04:11
在我所见过的汇编语言中(就像在其他编程语言中一样),有一个分隔符来标记注释:例如,注释前有一个分号:
ENDFIL LDA EOF ;COMMENT GOES HERE
RSUB ;ANOTHER COMMENT GOES HERE然而,在你的语法中,你能通过一行上它前面的空格的数量来判断它是不是一个注释,例如,在操作码和注释之间有两个(而不仅仅是一个)空格事件?
{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT}发布于 2009-05-26 04:06:13
如何判断某一行中的文本是操作数还是注释?它是基于上下文吗?例如,如果OPCODE是"RSUB",那么您应该知道不需要操作数?然后,您应该根据OPCODE读取的内容对操作数执行一些魔术操作:
if (OPCODE == "RSUB") OPERAND.clear();https://stackoverflow.com/questions/908847
复制相似问题