システム プログラミング クラス用の SIC アセンブラーのコーディングはほぼ完了しましたが、トークン化の部分で困惑しています。
たとえば、次のソース コード行を見てください。
形式 (自由形式) は次のとおりです。 {LABEL} OPCODE {OPERAND{,X}} {COMMENT}
カールは、フィールドがオプションであることを示します。
また、各フィールドは少なくとも 1 つのスペースまたはタブで区切る必要があります。
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("");
}
私の教授は、アセンブラを 2 つのバージョンのソース コード (エラーのあるバージョンとないバージョン) でテストするように要求しています。
RSUB OPCODE は OPERAND に依存していないため、RSUB OPCODE の後のすべてがコメントと見なされることは理解していますが、誤ったソース コードの OPERAND フィールドに値が含まれている場合、または OPERAND に依存する OPCODE が欠落している場合OPERAND 値、どうすればこれを補正できますか? これらにエラーとしてフラグを立て、誤った OPERAND 値 (またはその欠如) を出力する必要があります。
私の質問は、コードのコメント部分がオペランドと見なされないようにするにはどうすればよいですか?