编译原理—实验一(词法分析)

版权声明:欢迎转载 https://blog.csdn.net/wl1780852311/article/details/89927286

实验一 词法分析(2学时)
一、实验目的
1.熟悉词法分析的基本原理,词法分析的过程,以及词法分析中要注意的一些问题。
2. 复习高级语言,进一步加强用高级语言来解决实际问题的能力。
二、实验内容

有DFA如下图

编程实现此自动机,并处理下面的字符串,按顺序输出识别后的各单词(以空格或换行符隔开)。要求实现错误检查处理,当出现非法字符时,提示出错字符位置,并且停止分析。
(1)bacbacdabbaccb
(2)acbbbacbbacb
(3)baccdabaccbadacb
思路:用了一个C++中的二位映射(map)

#include<bits/stdc++.h>
using namespace std;
int f(char c)
{
	if(c=='a'||c=='b'||c=='c'||c=='d')
		return 1;
	else
		return 0;
}
int main()
{
	map<int,map<char,int> >m;
	m[0]['a']=1;m[0]['b']=0;m[1]['c']=1;m[1]['b']=3;m[1]['d']=2;m[2]['a']=1;
	int cursta=0,state;
	string str="",ss="";
	string s;
	cout<<"请输入您要分析的字符串:";
	cin>>s;
	int cnt=0,i;
	int  index,flag=0;
	char indexf;
	for(i=0;i<s.size();i++)
	{
		state=m[cursta][s[i]];
		cursta=state;
		str+=s[i];
		if(cursta==3)
		{
			cout<<str<<endl;
			cnt++; 
			ss+=str;
			str="";
			cursta=0;
		}
		if(f(s[i])==0)
		{
			index=i+1;
			indexf=s[i];
			flag=1;
			break;
		}
	}
	if(s!=ss&&flag==0)
	{
		for(int i=ss.size();i<s.size();i++)
		{
			cout<<s[i];
		}
		cout<<endl;
		cout<<"最后一个词不完整!!"<<endl; 
		return 0;
	}
	if(i==s.size()&&flag==0)
	{
		cout<<endl;
		cout<<"分析成功,字符串成功被划为"<<cnt<<"个词!!!"<<endl;
	}	
	if(flag==1)
	{
		cout<<"对不起,您输入的字符串中第"<<index<<"个字符"<<indexf<<"是一个非法字符!!!"<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/wl1780852311/article/details/89927286