システムプログラミングクラス用のSICアセンブラのコーディングが終了しましたが、トークン化の部分で困っています。あるSICアセンブラソースをトークン化
形式(自由形式):{LABEL} OPCODEは{OPERAND {X}} {コメント}
カールフィールドがあることを示す
例えば、ソースコードの行を取りますオプションです。
また、各フィールドは少なくとも1つのスペースまたはタブで区切る必要があります。
ENDFIL LDA EOF COMMENT GOES HERE
上記のコードは整理するのが少し面倒ですが、次のスニペットは私に困難を与えています。
RSUB COMMENT GOES HERE
私のコードは、OPERANDのようにコメントの最初の単語に読み込まれます。エラーのある1つずつなし -
//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フィールドの値が含まれているか、または依存するOPCODE OPERANDにOPERAND値が指定されていない場合、これをどのように補うことができますか?私はこれらをエラーとしてフラグを立て、誤ったOPERAND値(またはその不足)を出力する必要があります。
質問: コードのコメント部分がオペランドと見なされないようにするにはどうすればよいですか?
ことだ。そして、あなたが読んでいるものOPCODEに基づいてオペランドにいくつかの魔法を実行する必要があります。私の教授は、空白を参照して、仕様書に「ソースコードは自由形式であり、唯一の規則は各フィールドを少なくともスペースやタブで区切ることです」と述べています。 私は今このようなものにどのように対処するのか確信しています。 –
RSUBに演算子がないことを知っているはずですから、RSUBの後にはコメントが必要ですか? – ChrisW
あなたはおそらく正しいでしょう。たぶん、私は物事が複雑すぎるかもしれません。どうもありがとう! –