2 //s为初态,z为终态
3 int in(int s,int z)
4 {
5 if(s == z)
6 {
7 printf("3\nlook!the last status belongs to Z")
8 return 1
9 }
10 else
11 {
12 return 0
13 }
14 }
15 //s为状态,t为输入的字符
16 int step(int s,char t)
17 {
18 if(t == 'a')
19 switch(s)
20 {
21 case 0:return 1
22 case 1:return 3
23 case 2:return 1
24 case 3:return 3
25 }
26 else if(t == 'b')
27 switch(s)
28 {
29 case 0:return 2
30 case 1:return 2
31 case 2:return 3
32 case 3:return 3
33 }
34 }
35
36 int realize(char *input)
37 {
38 int z = 3
39 int s,i
40 s = 0
41 for(i=0input[i]!='\n'i++)
42 {
43 printf("%2d",s)
44 s = step(s,input[i])
45 }
46 if(in(s,z))
47 {
48 return 1
49 }
50 else
51 {
52 return 0
53 }
54 }
55
56 main()
57 {
58 int i
59 int a
60 char input[40]
61 printf("FA=({0,1,2,3},{a,b},M,0,{3})\n")
62 printf("M:\n")
63 printf("M(0,a)=1M(0,b)=2\n")
64 printf("M(1,a)=3M(1,b)=2\n")
65 printf("M(2,a)=1M(2,b)=3\n")
66 printf("M(3,a)=3M(3,b)=3\n")
68
69 lop:for(i=0input[i-1] != '\n'i++)
70 {
71 scanf("%c",&input[i])
72 }
73 for(i=0input[i-1]!='\n'i++)
74 {
75 if(input[i] != 'a'&&input[i] != 'b'&&input[i] != '\n')
76 {
77 printf("input error,enter again please:\n")
78 goto lop
79 }
80
81 }
82 printf("the status sequence is :\n")
83 a = realize(input)
84 if(a == 1)
85 printf("\nSo this string can be identified\n")
86 else
87 printf("\nSo this string can't be identified\n")
88 printf("press enter to exit the program\n")
89 getchar()
90
91 }
#include <stdio.h>#include <string.h>
char prog[80],token[8],ch
int syn,p,m,n,sum
char *rwtab[6]={"begin","if","then","while","do","end"}
scaner()
main()
{p=0
printf("\n please input a string(end with '#'):/n")
do{
scanf("%c",&ch)
prog[p++]=ch
}while(ch!='#')
p=0
do{
scaner()
switch(syn)
{case 11:printf("( %-10d%5d )\n",sum,syn)
break
case -1:printf("you have input a wrong string\n")
getch()
exit(0)
default: printf("( %-10s%5d )\n",token,syn)
break
}
}while(syn!=0)
getch()
}
scaner()
{ sum=0
for(m=0m<8m++)token[m++]=NULL
ch=prog[p++]
m=0
while((ch==' ')||(ch=='\n'))ch=prog[p++]
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch
ch=prog[p++]
}
p--
syn=10
for(n=0n<6n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1
break
}
}
else if((ch>='0')&&(ch<='9'))
{ while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0'
ch=prog[p++]
}
p--
syn=11
}
else switch(ch)
{ case '<':token[m++]=ch
ch=prog[p++]
if(ch=='=')
{ syn=22
token[m++]=ch
}
else
{ syn=20
p--
}
break
case '>':token[m++]=ch
ch=prog[p++]
if(ch=='=')
{ syn=24
token[m++]=ch
}
else
{ syn=23
p--
}
break
case '+': token[m++]=ch
ch=prog[p++]
if(ch=='+')
{ syn=17
token[m++]=ch
}
else
{ syn=13
p--
}
break
case '-':token[m++]=ch
ch=prog[p++]
if(ch=='-')
{ syn=29
token[m++]=ch
}
else
{ syn=14
p--
}
break
case '!':ch=prog[p++]
if(ch=='=')
{ syn=21
token[m++]=ch
}
else
{ syn=31
p--
}
break
case '=':token[m++]=ch
ch=prog[p++]
if(ch=='=')
{ syn=25
token[m++]=ch
}
else
{ syn=18
p--
}
break
case '*': syn=15
token[m++]=ch
break
case '/': syn=16
token[m++]=ch
break
case '(': syn=27
token[m++]=ch
break
case ')': syn=28
token[m++]=ch
break
case '{': syn=5
token[m++]=ch
break
case '}': syn=6
token[m++]=ch
break
case '': syn=26
token[m++]=ch
break
case '\"': syn=30
token[m++]=ch
break
case '#': syn=0
token[m++]=ch
break
case ':':syn=17
token[m++]=ch
break
default: syn=-1
break
}
token[m++]='\0'
}