题
我几乎完成了为系统编程课程编码的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();
不隶属于 StackOverflow