给定一个正规式R=XY*|YX*Y|XYX,对此正规式的最小化DFA进行编程,完成词法分析器工作。
一、实验题目:给定一个正规式 R = XY* | YX*Y | XYX ,请先在练习本上将此正规式转变为NFA、DFA、最小化DFA;对你所完成的最小化DFA进行编程,完成词法分析器工作。
二、设计分析:
1.将正规式转变为NFA
2.再写出转换表
x | y | |
---|---|---|
A. | ||
B. | φ | |
C. | ||
D. | ||
E. | ||
F. | φ | φ |
G. | φ | |
3.根据转换表画出DFA | ||
![]() |
||
4.合并等价状态 | ||
由上述转换表可知C、E两个状态是等价的,可以合并,最小化DFA后可以得到六个状态,重新标号为0→{A} , 1→{C,E} , 2→{B} , 3→{G} , 4→{D} , 5→ | ||
5.最小化DFA为 | ||
![]() |
||
三、程序代码: |
#include<iostream>
#include<string>
using namespace std;
//判断字符串是否为正规文法
void judge(){
string s;
cout<<"请输入一个字符串: ";
bool vis1=true;
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]!='x'&&s[i]!='y'){
cout<<"您输入的格式有误!"<<endl;
return;
}
}
if(s[0]=='x'&&len==1){
cout<<"属于正规式R=xy*"<<endl;
return;
}else if(s[0]=='x'){
if(s[1]=='y'){
if(s[2]=='x'&&len==3){
cout<<"属于正规式R=xyx"<<endl;
return;
}else{
for(int i=2;i<len;i++){
if(s[i]!='y'){
cout<<"不属于正规式R"<<endl;
return;
}
}
cout<<"属于正规式R=xy*"<<endl;
return;
}
}else{
cout<<"不属于正规式R"<<endl;
return;
}
}else{
if(s[len-1]!='y'){
cout<<"不属于正规式R"<<endl;
return;
}else{
for(int i=1;i<len-1;i++){
if(s[i]!='x'){
cout<<"不属于正规式R"<<endl;
return;
}
}
cout<<"属于正规文法R=yx*y"<<endl;
}
}
}
int main(){
judge();
return 0;
}