实验一 利用子集法构造DFA

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一利用子集法构造DFA 一、实验目的

掌握将非确定有限自动机确定化的方法和过程

二、实验要求及内容

实验要求:

1.输入一个NFA,输出一个接受同一正规集的DFA;

2.采用C++语言,实现该算法;

3.编制测试程序;

4.调试程序。

实验步骤:

1.输入一个NFA关系图;

2.通过一个转换算法将NFA转换为DFA;

3.显示DFA关系图。

三、实验环境

计算机、Windows 操作系统、Visual C++ 程序集成环境。

四、程序代码

#include "stdafx.h"

#include

#include

#include

#include

#include

using namespace std;

struct edge{

int start,end;

char c;

}

E[100],Ekong[100];//E保存所有的边,Ekong保存转换字符为空的边

struct State{

int H[100];//状态集合

int count;//状态集合中的元素个数

int flag;//是否是接受状态

int mark;//状态编号

};

int n;//n:边数

int nk=0;//空字符转换的边数

int first,accept;//开始状态,接受状态

char alpha[100];//输入字母表,#代表空串

int numof_char=0;//字母表中的字符个数

int useof_char[256];//该转换字符是否用过

int f[200];//状态属性标志:0表示始态,1表示接受态,-1表示中间态State DFA[100];//DFA状态集

int useof_DFA[100];//标志构造出来的状态是否已存在

int numof_Dtran=0;//最后得到的DFA中的状态数

char Dtran[100][100];//DFA状态转换表

void input()

{

int i,s,e;

char ch;

cout<<"请输入转换的有向边数n:"<

cin>>n;

cout<<"请输入NFA的开始状态:"<

cin>>first;

cout<<"请输入NFA的接受状态(输入-1结束):"<

memset(f,-1,sizeof(f));

memset(useof_char,0,sizeof(useof_char));

f[first]=0;

cin>>accept;

while(accept!=-1)

{

f[accept]=1;

cin>>accept;

}

cout<<"请输入NFA,起点,终点,转换字符('#'表示空字符):"<

for(i=0;i

{

cin>>s>>e>>ch;

E[i].start=s;

E[i].end=e;

E[i].c=ch;

if(ch!='#'&&!useof_char[ch])

{

alpha[numof_char++]=ch;

useof_char[ch]=1;

}

if(ch=='#')

{

Ekong[nk].start=s;

Ekong[nk].end=e;

Ekong[nk].c=ch;

nk++;

}

}

}

State move(State T,char s)//c!='#'

{

State temp;

temp.count=0;

temp.mark=T.mark;

int i,j=0,k=0;

for(i=0;i

{

j=0;

while(j

{

if(E[j].start==T.H[i]&&E[j].c==s)

{ temp.H[temp.count++]=E[j].end;

}

j++;

}

}

return temp;

}

void arriveBynone(int t,int result[],int& num)//搜索状态t通过一个或多个空字符到达的状态,结果存在result中

{

int k=0;

int m=0;

num=0;

stack S;

S.push(t);

int j;

while(!S.empty())

{

j=S.top();

S.pop();

m=0;

while(m

{

if(Ekong[m].start==j)

{

result[num++]=Ekong[m].end;

相关文档
最新文档