编译原理:实验三自动机程序的设计与实现

一、实验目的
编写程序实现自动机对词法分析单词的识别程序
二、实验重难点
自动机的程序实现及识别
三、实验内容与要求
1、FA的程序表示;
2、FA的识别。
四、实验学时
4课时
五、实验设备与环境
Visual C++ 6.0
六、实验过程
1.给出附录中自动机的图形化表示。

在这里插入图片描述

  1. 该自动机的初态是 0 ;终态集是 3 。
  2. 输入附录中给出的代码,并进行调试运行及测试:
    ⑴测试用例1: aab ;
    ⑵运行结果:

在这里插入图片描述

⑶测试用例2:: bba ;
⑷运行结果:
在这里插入图片描述

  1. 构造正规式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();
							}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值