C++ SIC汇编程序源代码的标记化

C++ SIC汇编程序源代码的标记化,c++,tokenize,sic,C++,Tokenize,Sic,我已经基本完成了为我的系统编程类编写一个SIC汇编程序的工作,但是我在标记化部分遇到了困难 例如,以这行源代码为例: 格式(自由格式)是:{LABEL}操作码{操作数{,X}}{COMMENT} 卷曲表示该字段是可选的 此外,每个字段必须至少用一个空格或制表符分隔 ENDFIL LDA EOF COMMENT GOES HERE 上面的代码更容易组织,但下面的代码片段给我带来了困难 RSUB COMMENT GOE

我已经基本完成了为我的系统编程类编写一个SIC汇编程序的工作,但是我在标记化部分遇到了困难

例如,以这行源代码为例:

格式(自由格式)是:{LABEL}操作码{操作数{,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操作码不依赖于操作数,因此我理解RSUB操作码之后的所有内容都可以被视为注释,但如果错误的源代码在操作数字段中包含值,或者依赖于操作数的操作码缺少操作数值,我如何对此进行补偿?我需要将这些标记为错误,并打印出错误的操作数值(或没有)

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

在我所看到的汇编语言(与其他编程语言一样)中,有一个分隔符标记注释:例如注释前的分号:

ENDFIL LDA EOF ;COMMENT GOES HERE
RSUB ;ANOTHER COMMENT GOES HERE
但是,在您的语法中,您是否可以通过行中某个内容前面的空白量来判断该内容是否为注释,例如,操作码和注释之间存在两个(而不仅仅是一个)空白事件

{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT}
{LABEL}操作码{操作数{,X}}{COMMENT}

如何判断某行中的文本是操作数还是注释?它是基于上下文的吗?例如,如果操作码是“RSUB”,那么您就知道不需要操作数了?然后,您应该根据读取的操作码对操作数执行一些魔术:

if (OPCODE == "RSUB") OPERAND.clear();

就是这样,没有分隔符可以用来区分注释字段和操作数字段。关于空白,我的教授在他的说明书中说:“源代码是自由格式的,唯一的规则是每个字段至少要用空格或制表符隔开。”。我现在知道怎么处理这样的事情了。是不是你应该知道RSUB没有任何操作符,因此RSUB后面的任何内容都必须是评论?你可能是对的。也许我只是把事情复杂化了。谢谢!是的,我希望事情能这么简单。我需要在我的项目中运行错误的源代码。如果RSUB操作码后有一个操作数,那么我需要标记一个错误并打印出该操作数。如果我清除了操作数字段,那么就没有什么可打印的了。在这种情况下,您可能需要计算操作码和操作数之间的空白。如果不止一条,那么您应该假设它是一条注释