编译原理:实验三自动机程序的设计与实现
一、实验目的
编写程序实现自动机对词法分析单词的识别程序
二、实验重难点
自动机的程序实现及识别
三、实验内容与要求
1、FA的程序表示;
2、FA的识别。
四、实验学时
4课时
五、实验设备与环境
Visual C++ 6.0
六、实验过程
1.给出附录中自动机的图形化表示。
- 该自动机的初态是 0 ;终态集是 3 。
- 输入附录中给出的代码,并进行调试运行及测试:
⑴测试用例1: aab ;
⑵运行结果:
⑶测试用例2:: bba ;
⑷运行结果:
- 构造正规式00(0|1)*11相应的DFA。
⑴与该正规式等价的NFA为:
⑵与该正规式等价的最小化DFA为:
⑶编写程序实现该DFA:
①程序代码:
#include <stdio.h>
int in(int s, int z)
{
if (s==z)
{
printf("arrive at the end state 4\n");
return 1;
}
else
return 0;
}
int step(int s, char t)
{
if (t=='0')
{
switch(s)
{
case 0: return 1;
case 1:return 2;
case 2:return 2;
case 4:return 2;
}
}
else if(t=='1')
{
switch(s)
{
case 2:return 4;
case 4:return 4;
}
}
}
int realize(char *input)
{
int z=4;
int s,i;
// s=s0;
for (int i=0;input[i]!='\n';i++)
{
printf("%2d",s);
s = step(s,input[i]);
}
if (in(s,z))
return 1;
else
return 0;
}
main()
{
int i;
int a;
char input[40];
printf("FA=({0,1,2,4},{0,1},M,0,{4})\n");
printf("M:\n");
printf("M(0,0)=1 ");
printf("M(1,0)=2 ");
printf("M(2,0)=2 M(2,1=4\n)");
printf("M(4,0)=2 M(4,1=4\n)");
printf("please enter your string which is to be checked:\n");
lop: for(i=0;input[i-1]!='\n';i++)
scanf("%c",&input[i]);
for(i=0;input[i-1]!='\n';i++)
if(input[i]!='0'&&input[i]!='1'&&input[i]!='\n')
{
printf("input error,enter again please;\n");
goto lop;
}
printf("the status sequence is:\n");
a=realize(input);
if(a==1)
printf("\nSo this string can be identified\n");
else
printf("\nSo this string can not be identified\n");
printf("press enter to exit the program\n");
getchar();
}
②测试运行结果:
教师评语:
是否完成实验程序的预备设计? 是: 不是:
程序能否正常运行? 是: 不是:
有无测试数据及结果分析 是: 不是:
是否在本次规定时间完成所有项目? 是: 不是:
实验成绩等级: 教师签名:
N0: 时间:
附录:
FA = ({0,1,2,3},{a,b},M,0,{3})
M: M(0,a)=1 M(0,b)=2
M(1,a)=3 M(1,b)=2
M(2,a)=1 M(2,b)=3
M(3,a)=3 M(3,b)=3
参考程序:
#include <stdio.h>
int in(int s, int z)
{
if (s==z)
{
printf("arrive at the end state 3\n");
return 1;
}
else
return 0;
}
int step(int s, char t)
{
if (t=='a')
{
switch(s)
{
case 0;return 1;
case 1:return 3;
case 2:return 1;
case 3:return 3;
}
}
else if(t=='b')
{
switch(s)
{
case 0:return 2;
case 1:return 2;
case 2:return 3;
case 3:return 3;
}
}
}
int realize(char *input)
{
int z=3;
int s,i;
s=s0;
for (int i=0;input[i]!='\n';i++)
{
printf("%2d",s);
s = step(s,input[i]);
}
if (in(s,z))
return 1;
else
return 0;
}
main()
{
int i;
int a;
char input[40];
printf("FA=({0,1,2,3},{a,b},M,0,{3})\n");
printf("M:\n");
printf("M(0,a)=1 M(0,b=2\n)");
printf("M(1,a)=3 M(1,b=2\n)");
printf("M(2,a)=1 M(2,b=3\n)");
printf("M(3,a)=1 M(3,b=3\n)");
printf("please enter your string which is to be checked:\n");
lop: for(i=0;input[i-1]!='\n';i++)
scanf("%c",&input[i]);
for(i=0;input[i-1]!='\n';i++)
if(input[i]!='a'&&input[i]!='b'&&input[i]!='\n')
{
printf("input error,enter again please;\n");
goto lop;
}
printf("the status sequence is:\n");
a=realize(input);
if(a==1)
printf("\nSo this string can be identified\n");
else
printf("\nSo this string can not be identified\n");
printf("press enter to exit the program\n");
getchar();
}