给定一个正规式R=XY*|YX*Y|XYX,对此正规式的最小化DFA进行编程,完成词法分析器工作。


一、实验题目:给定一个正规式 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;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM