2009-05-26 8 views
3

システムプログラミングクラス用の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値(またはその不足)を出力する必要があります。

質問: コードのコメント部分がオペランドと見なされないようにするにはどうすればよいですか?

答えて

-1

私が見てきたこと(他のプログラミング言語のように)、アセンブリ言語では、コメントマーク区切り記号があります:セミコロンコメントの前には、例えば:あなたの構文で

ENDFIL LDA EOF ;COMMENT GOES HERE 
RSUB ;ANOTHER COMMENT GOES HERE 

しかし、することができます行に先行する空白の量によって何かがコメントであるかどうかを知ることができます。オペコードとコメントの間に2つの(1つだけではない)空白イベントが存在するという事実によって、

{LABEL}<whitespace>OPCODE<whitespace>{OPERAND{,X}}<whitespace>{COMMENT} 
+0

ことだ。そして、あなたが読んでいるものOPCODEに基づいてオペランドにいくつかの魔法を実行する必要があります。私の教授は、空白を参照して、仕様書に「ソースコードは自由形式であり、唯一の規則は各フィールドを少なくともスペースやタブで区切ることです」と述べています。 私は今このようなものにどのように対処するのか確信しています。 –

+0

RSUBに演算子がないことを知っているはずですから、RSUBの後にはコメントが必要ですか? – ChrisW

+0

あなたはおそらく正しいでしょう。たぶん、私は物事が複雑すぎるかもしれません。どうもありがとう! –

-1

特定の行のテキストがオペランドかコメントかどうかをどのように判断できますか?それは文脈に基づいていますか?たとえば、OPCODEが "RSUB"の場合、OPERANDは必要ないことがわかりますか?私は、オペランドフィールドからコメントフィールドを区別するために使用することができデリミタはありません、

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

そうですね、それは簡単なことでした。私は私のプロジェクトの一部として間違ったソースコードを実行する必要があります。 RSUBオペコードの後に​​オペランドがある場合は、エラーにフラグを立ててオペランドを出力する必要があります。オペランドフィールドをクリアすると、何も印刷されません。 –

+0

その場合、オペコードとオペランドの間の空白を数えなければならないかもしれません。複数ある場合は、それがコメントであると仮定すべきです –