システムプログラム'01 演習問題(1)


準備

まず、Bison と Flexのインストールを読んで、 flexと bisonというプログラムを各自のノート PCにインストールしてください。 (ハードディスクに 3MB程度の空きが必要です。)

その 1

(難易度 A) (a|b)*abbという正規表現を認識する DFAの状態遷移表は次のようになる。
    ACB D E 
aBBBB
bACDEAC
開始状態は AC、終了状態は Eである。

この状態遷移表を用いて、引数として渡された文字列が、正規表現 (a|b)*abbにマッチするならば 1をそうでなければ 0を返す関数 int ababb(char*)を定義せよ。

プログラムはこんな感じ

#include <stdio.h>

int table[?][?] = {?}; /* 遷移表を配列として表現 */
int ababb(char* str) {
  ?
}

int main(int argc, char** argv) {
  int i;
  for (i=1; i<argc; i++) {
    char* str = argv[i];
    if (ababb(str)) {
      printf("%sは正規表現 (a|b)*abbにマッチします。\n", str);
    } else {
      printf("%sは正規表現 (a|b)*abbにマッチしません。\n", str);
    }
  }
  return 0;
}
?の部分を埋めてください。


その 2

flexについてを読んで、 その中の例題をコンパイルし実行してみてください。 そしてこれらの例題を参考にして、次の問題をやってください。
  1. (難易度 A)入力中の「hello」という文字列を「sawadi」に書き換える flexプログラムを作成せよ。
  2. (難易度 B)入力中の「/*」と「*/」に囲まれた部分を赤色で出力する flexプログラムを作成せよ。

システムプログラムのホームページ
Koji Kagawa (kagawa@eng.?????)