一、实验题目:给定一个正规式 R = XY* | YX*Y | XYX ,请先在练习本上将此正规式转变为NFA、DFA、最小化DFA;对你所完成的最小化DFA进行编程,完成词法分析器工作。
二、设计分析:
1.将正规式转变为NFA
2.再写出转换表
x | y | |
---|---|---|
A.{x} | {1,2,6,Y} | {3,4,5} |
B.{1,2,6,Y} | φ | {2,7,Y} |
C.{3,4,5} | {4,5} | {Y} |
D.{2,7,Y} | {Y} | {2,Y} |
E.{4,5} | {4,5} | {Y} |
F.{Y} | φ | φ |
G.{2,Y} | φ | {2,Y} |
3.根据转换表画出DFA
4.合并等价状态
由上述转换表可知C、E两个状态是等价的,可以合并,最小化DFA后可以得到六个状态,重新标号为0→{A} , 1→{C,E} , 2→{B} , 3→{G} , 4→{D} , 5→{F}
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;
}