正则式转换成最小DFAWord格式文档下载.docx
- 文档编号:22013258
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:30
- 大小:20.09KB
正则式转换成最小DFAWord格式文档下载.docx
《正则式转换成最小DFAWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《正则式转换成最小DFAWord格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
//dfa简化后存储数组
intstack_ji[MAXLENGTH];
//寻找closure集合所用栈
intq_head,q_tail;
//closure集合所用队列头尾指针
intmin_dfa[MAXLENGTH][MAXLENGTH];
intbuff_mdfa[MAXLENGTH];
intxulie[MAXLENGTH];
intmin_dfa_num;
intflag_min;
//
voidinit(void);
//初始化一些全局变量
voidstart_token(void);
//开始
intletter_found(char*);
//将正则式中的字母和种类数找出来
intismistake(void);
//正规式是否错误
inthave_letter(int);
//在正规式字符串该点以前是否有字母
voidjiadian(char*);
//在正则式中加入点作为连接运算符
intpre(char);
//nfa运算符优先级
charnibolan(char*);
//改写成逆波兰式
voidNFA_create(void);
//构造nfa
intfound_ji(int);
//寻找closure集合
//voidpaixu(int*,int);
//排序数组
intinsert(int*,int,int);
//closure集合插入新元素
intsame_clo(int);
//查看是否已有相同的closure
voidDFA_create(void);
//构造dfa
voidmin_DFA(void);
//构造最小dfa
intfound_z(void);
//寻找终态集合
intsame_contain(int,int);
//查看两个状态是否在一个集合里
intcontain(int,int);
//查看两个状态中同一个变量下的两个状态是否相同
intmin_f(int);
//输入dfa的状态,返回其在最小dfa中的状态
intmain()
{
intn,i,t,k;
chary;
intj;
do
{
init();
printf("
\n请输入正规式(只能用小写字母,以#开始,以#结束):
);
scanf("
%s"
token);
getchar();
if(ismistake()==1)
{
printf("
\n正则式错误!
!
\n"
}
else
{
start_token();
\n是否继续?
Y/N\n"
//scanf("
%c"
&
y);
y=getchar();
}while(y=='
y'
exit(0);
}
voidstart_token()
{
intn=0,i,t,k,i1;
len_letter=t=letter_found(token);
jiadian(token);
nibolan(buff);
NFA_create();
printf("
\n逆波兰式为:
string);
\n字母集为:
letter);
(@代表空):
for(i=0;
i<
len_nfa;
i++)
\nstates:
%c\t%d->
%d"
nfa_s[i],nfa_g[i][0],nfa_g[i][1]);
}
\nhead:
%d\ttail:
%d\n"
head[0],tail[0]);
DFA_create();
\n\n(∞代表为空)"
\n状态\t"
if(t==0)
dfa1[0][0][1]);
t;
%c\t"
letter[i]);
}
q_head;
for(j=0;
j<
t+1;
j++)
if(dfa1[i][j][1]==9&
&
dfa1[i][j][2]==9&
dfa1[i][j][3]==9)
{
printf("
∞"
}
else
{
for(k=1;
k<
dfa1[i][j][0]+1;
k++)
{
dfa1[i][j][k]);
}
}
\t"
\n\n确定DFA(∞代表为空):
状态\t"
if(dfa2[i][j]==999)
printf("
dfa2[i][j]);
min_DFA();
\n\n确定最小DFA(∞代表为空):
/*printf("
min_dfa_num;
for(i1=0;
min_dfa[i][i1]!
=999;
i1++)
min_dfa[i][i1]);
*/
%d\t"
终态"
else
{
for(i=0;
}
//printf("
min_dfa_num);
for(i=0,i1=0;
if(i==min_f(i1))
i);
for(j=1;
if(dfa2[i1][j]==999)
{
printf("
}
else
min_f(dfa2[i1][j]));
}
i++;
\n\n\n"
}
voidinit(void)
inti=0,j,k;
len_letter=0;
len_nfa=0;
q_head=0;
q_tail=0;
head[1]=0;
head[2]=0;
tail[1]=0;
tail[2]=0;
MAXLENGTH;
token[i]='
\0'
buff[i]='
//
stack[i]='
string[i]='
letter[i]='
buff_mdfa[i]=999;
xulie[i]=999;
nfa_g[i][0]=0;
nfa_g[i][1]=0;
buff_dfa[i]=0;
bufd[i]=0;
len_closure[i]=0;
buff_ji[i]=0;
stack_ji[i]=0;
closure[i][j]=0;
dfa2[i][j]=999;
min_dfa[i][j]=999;
for(k=0;
dfa1[i][j][k]=0;
intinit_mdfa()
inti;
intismistake()
inti,t=1;
intk=0;
for(k=0;
{
if(token[k]=='
('
)
t++;
if(t<
1)
return1;
elseif(token[k]=='
)'
t--;
if(t!
=1)return1;
if(token[0]!
='
#'
)return1;
for(i=1;
if(token[i]>
a'
token[i]<
z'
switch(token[i])
case'
:
if(token[i+1]!
return1;
break;
}
|'
if(token[i+1]=='
||token[i+1]=='
||have_letter(i)==0)
*'
if(have_letter(i)==0)
if(token[i-1]!
return0;
default:
return1;
break;
return0;
inthave_letter(inti)
for(j=0;
i;
if(token[j]>
token[j]<
return1;
intletter_found(char*token)
inti,j,k=0,p=1;
token[i]!
for(j=0;
26;
if(token[i]==letter[j])p=0;
if(p!
=0)
letter[k]=token[i];
k++;
p=1;
returnk;
intpre(charch)//运算符优先级
switch(ch)
case'
i=0;
.'
i=1;
i=2;
default:
i=3;
returni;
charnibolan(char*buff)//将正则式转化成逆波兰式
chara,b;
inti=1,j=1,k=0;
stack[0]='
a=buff[i];
while(a!
if(a=='
stack[j++]=a;
elseif(a=='
while(stack[j-1]!
string[k++]=stack[--j];
--j;
||a=='
b=stack[j-1];
while(pre(a)>
=pre(b))
string[k++]=b;
--j;
b=stack[j-1];
string[k++]=a;
a=buff[++i];
a=stack[--j];
while(a=='
string[k++]=a;
a=stack[--j];
string[k]='
voidjiadian(char*token)
inti=1,j=1;
buff[0]='
while(token[i]!
if(token[i+1]>
token[i+1]<
buff[j]=token[i];
buff[j+1]='
i++;
j=j+2;
elseif(token[i+1]=='
else
j++;
buff[j]='
voidNFA_create(void)
inti,h=1,t=2,p=0;
intflag_head_tail=-1;
len_nfa=1;
string[i]!
if(string[i]>
string[i]<
flag_head_tail++;
head[flag_head_tail]=h;
tail[flag_head_tail]=t;
nfa_g[len_nfa][0]=h;
nfa_g[len_nfa][1]=t;
nfa_s[len_nfa]=string[i];
len_nfa++;
t=t+2;
h=h+2;
elseif(string[i]=='
nfa_g[len_nfa][0]=tail[flag_head_tail-1];
nfa_g[len_nfa][1]=head[flag_head_tail];
nfa_s[len_nfa]='
@'
tail[flag_head_tail-1]=tail[flag_head_tail];
tail[flag_head_tail]=0;
head[flag_head_tail]=0;
flag_head_tail--;
nfa_g[len_nfa][0]=tail[flag_head_tail];
tail[flag_head_tail]=nfa_g[len_nfa][1];
//这是一种简化算法,下面注释的是实际算法
/*nfa_g[len_nfa][0]=h;
nfa_g[len_nfa][1]=head[flag_head_tail-1];
head[flag_head_tail-1]=h;
tail[flag_head_tail-1]=t;
nfa_g[0][0]=0;
nfa_g[0][1]=head[0];
nfa_s[0]='
head[0]=0;
intfound_ji(i)
intm=0;
intk0=0;
intk1,k2,k3;
inti1,j,q,q1;
intp=0;
stack_ji[p]=i;
buff_ji[k0]=stack_ji[p];
p++;
k0++;
while(p!
k1=stack_ji[p-1];
stack_ji[p-1]=0;
p--;
m=0;
while(m<
len_nfa)
if(nfa_s[m]=='
nfa_g[m][0]==k1)
stack_ji[p]=nfa_g[m][1];
buff_ji[k0]=stack_ji[p];
k0++;
p++;
m++;
q1=k0;
for(i1=0;
i1<
q1;
for(j=i1+1;
if(buff_ji[i1]>
buff_ji[j])
q=buff_ji[i1];
buff_ji[i1]=buff_ji[j];
buff_ji[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 转换 最小 DFA