实验三 有限自动机的构造与识别

实验三 有限自动机的构造与识别

一、实验目标
  
1、掌握有穷状态自动机的概念;  
2、掌握有穷状态自动机的存储及表示方法;
3、掌握有穷状态自动机与正则式之间的关系。
 
二、实验要求
  
1、输入正规式; 

2、构造该正规式的有穷状态自动机;

3. 以五元组形式输出。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #define N 100
  4 char r[N];
  5 int s,t;
  6 int q=1;
  7 struct f{
  8     char r;
  9     int  a;
 10     int  b;
 11 };
 12 typedef struct f F;
 13 
 14 F f[50];
 15 int n=0;
 16 
 17 main()
 18 {   char ch;
 19     int p=0;
 20     int j;
 21 
 22       printf("
请输入正规式(以'#'结束): ");
 23       do
 24       {
 25           ch=getchar();
 26           r[p++]=ch;
 27       }while (ch!='#');
 28 
 29       r2nfa(r,0,p-1,0,1);
 30 
 31       printf("
nfa的分列过程如下:");
 32       for (j=0;j<n;j++)
 33       {
 34            printf("
 f(%d, %c)=%d 
",f[j].a,f[j].r,f[j].b);
 35       }
 36 
 37       system("pause");
 38 
 39 
 40   }
 41 
 42 
 43 r2nfa(char r[],int s,int t,int a,int b)
 44 {   int i;
 45 
 46     if (t-s==1)
 47     {
 48         f[n].a=a;
 49         f[n].r=r[s];
 50         f[n].b=b;
 51         n++;
 52     }
 53     else
 54     {
 55         i=lowest(r,s,t);
 56 
 57         if (r[i]=='|')
 58         {
 59             r2nfa(r,s,i,a,b);
 60             r2nfa(r,i+1,t,a,b);
 61         }
 62 
 63         else if (r[i]=='.')
 64         {
 65             q++;
 66             r2nfa(r,s,i,a,q);
 67             r2nfa(r,i+1,t,q,b);
 68         }
 69 
 70         else
 71         {
 72             q++;
 73 
 74             f[n].a=a;
 75             f[n].r='~';
 76             f[n].b=q;
 77             n++;
 78 
 79             f[n].a=q;
 80             f[n].r='~';
 81             f[n].b=b;
 82             n++;
 83 
 84             r2nfa(r,s,t-1,q,q);
 85         }
 86     }
 87 }
 88 
 89 int lowest(char r[],int s,int t)
 90 {   int i,j;
 91     int priority=5;
 92 
 93     for (j=s;(j<t);j++)
 94     {
 95         switch(r[j])
 96         {
 97             case '|':
 98                 if (priority>1)
 99                     {
100                         i=j;
101                         priority=1;
102                     }
103                 break;
104              case '.':
105                  if (priority>2)
106                     {
107                         i=j;
108                         priority=2;
109                     }
110                 break;
111              case '*':
112                   if (priority>3)
113                     {
114                         i=j;
115                         priority=3;
116                         }
117                 break;
118              default:  ;
119         }
120     }
121     return i;
122 }

自动机nfa

状态0(初态)->状态1(终态)的过程

运行结果如图所示:

原文地址:https://www.cnblogs.com/zhiling123/p/6121239.html