« ライト、ついてますか | トップページ | ライト、ついてますか2 »

2007年8月29日 (水)

ソースからコメントを削除する3

こんな簡単なプログラムでもバグがあったので修正。

  • バグ内容:C形式のコメント「/*    */」で、終わりに「**/」と、アスタが複数続いた場合に、コメントが終了したとみなされない。
  • バグ原因:C形式のコメントの中に「*」が連続して出て来た時に、「次でコメント終了するかも」ステータスから、「まだコメントの中だよ」ステータスに遷移していた。正しくは、引き続き「次でコメント終了するかも」ステータスに遷移しなければならない。
  • 類似バグ調査/今後の対策:状態遷移表を作成して、全ステータス、全イベントの調査が必要

そんなわけで、「次でコメント終了するかも」ステータスにおける処理を修正しました。といっても、この処理の関数版をこのブログに載せるのはこれが初めてですね。

static int cmt_semi_end(int char0, FILE* p_out){
  int next_state = ST_ERROR;

  if(char0 == EOF){
    return next_state;
  }

  switch(char0){
  case '/':
    next_state = NON_CMT;
    break;
  case '*':
    next_state = CMT_SEMI_END;
    break;
  default:
    next_state = C_CMT;
    break;
  }

  return next_state;
}

追記:この関数に限ったことではありませんが、文字列や文字として「/」があった場合の処理が抜けています。バグです。設計面での改善として、状態遷移表を作成した方がよさそうです。実装面での改善として、状態遷移表を落とし込んだテーブル駆動形式にしようと思います。

状態遷移表のイメージ。縦軸-状態。横軸-入力文字。各項目-(入力文字を出力|'/'+入力文字を出力|出力しない)

|

« ライト、ついてますか | トップページ | ライト、ついてますか2 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/207693/16280657

この記事へのトラックバック一覧です: ソースからコメントを削除する3:

« ライト、ついてますか | トップページ | ライト、ついてますか2 »