C言語関係掲示板

過去ログ

No856 状態遷移表から(a|b)*abbという正規表現を判定する

[戻る] [ホームページ]
No.11012

正規表現
投稿者---三岡(2003/12/10 20:07:28)


(a|b)*abbという正規表現を認識するDFAの状態遷移表を、

  A|B|C|D
a|B|B|B|B
b|A|C|E|A (開始状態はA,終了状態はD)

として、これを用いて正規表現にマッチするかどうかを判定するプログラムです。

正規表現にマッチするならば1を、そうでなければ0を返す関数のababbができてないようなんですが、教えてください。
配列の部分も出来てないかもしれない。
ちなみに、自分で書いたものは全然ダメなようなので無視してくれて結構です。

#include <stdio.h>

int table[2][4] = { {2,2,2,2}, {1,3,4,1}}; /* 遷移表を配列として表現 */
int ababb(char* str) {
  int jyotai;
  int k;

  int str2[];
  int j;
  for(j = 0; j != \0; j++){
    if(str[j] = a)
       str2[j] = 0;
    if(str[j] = b)
       str2[j] = 1;
  }

  for(jyotai = 0, k = 0; k != \0; k++)
    jyotai = table[str2[k]][jyotai];

  if(jyotai=4){
    return 1;
  }else{
    return 0;
  }
}

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;
}



No.11015

Re:正規表現
投稿者---かずま(2003/12/10 20:50:14)


> (a|b)*abbという正規表現を認識するDFAの状態遷移表を、
> 
>   A|B|C|D
> a|B|B|B|B
> b|A|C|E|A (開始状態はA,終了状態はD)


E は、D の間違いですね。


> ちなみに、自分で書いたものは全然ダメなようなので無視してくれて結構です。

C を基本から勉強し直してください。

・比較の演算子は、= ではなく、==。
・配列の添え字は、1 ではなく、0 から始まる。
・文字定数は、a ではなく、'a'。
    ......


 ---------------------------------------------------------------------
int table[2][4] = {
    { 1, 1, 1, 1 },
    { 0, 2, 3, 0 }
};

int ababb(char *str)
{
    int state = 0, i;

    for (i = 0; str[i] != '\0'; i++)
        if (str[i] == 'a')
            state = table[0][state];
        else if (str[i] == 'b')
            state = table[1][state];
        else    /* unknown character */
            return 0;
    return state == 3;
}

----------------------------------------------------------------------
状態を分かりやすく書くなら、

enum { A, B, C, D };

int table[2][4] = {
    { B, B, B, B },
    { A, C, D, A }
};

    int state = A, i;

    return state == D;


No.11017

Re:正規表現
投稿者---三岡(2003/12/10 21:00:09)


>C を基本から勉強し直してください。
すいません。Cでのプログラミングは久々だったのでいろいろと忘れていたみたいです。。。
勉強しなおさないといけませんね。
教えて下さってありがとうございました。