确定有穷自动机c语言实现

Python012

确定有穷自动机c语言实现,第1张

1 #include <stdio.h>

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")

67 printf("请输入你要检查的串")

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'

}

这是一个C语言的注释的有限自动机的实现代码。这是一个测试代码,采用的是输入一个字符串,让程序判断是不是一个有效的C语言风格的注释,也就是这种形式:/**/的注释。输入的过程中,不要使用空格。这只是一个简单的测试代码。