版权声明:欢迎转载 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;
}
}