版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实 验 报 告实验项目列表序号实验项目名称成绩01DFA的生成与字符串的识别02程序段的单词识别0304050607080910111213141516总评成绩: 教员签字:一、 实验名称程序段的单词识别二、实验目的1.掌握根据DFA构造词法分析程序的方法; 2.解决词法分析程序构造的相关问题。三、实验内容和要求给定一个小语言SIM,其字符集及单词定义如下:字符集:<字符集>:<字母>|<数字>|<界符><字母>:=A|B|C|Z|a|b|c|z<数字>:=0|1|2|9<界符>:=+|-|=|:|;|,|单词
2、集:<单词集>:=<保留字>|<标识符>|<整数>|<界符><保留字>:=var|begin|end|str|integer<标识符>:=<字母>|<标识符><数字>|<标识符><字母><整数>:=<数字>|<整数><数字><字符串常数>:=除单引号外的任意字符集中的字符单词类别可以用整数表示,如下表1:表1单词类别单词varbeginendstrinteger界符标识符整数字符串常数类别12
3、3456789要求:(1)输入输出输入:SIM语言程序段输出:SIM语言程序段的单词序列。(2)具体功能根据识别SIM程序段的DFA手工编写一个识别SIM语言单词的程序,运行该程序即可识别SIM语言程序段的所有单词。程序的具体功能如下:1)输入一个SIM语言的程序段2)对SIM语言程序段进行扫描,根据程序段的字符进行单词的拼写和识别,直到识别出一个单词,给出该单词的二元式。3)重复2),依次识别SIM程序段的每个单词,直到程序段扫描完毕,程序结束。4)数据结构这个程序中涉及的数据结构只有单词的二元式。四、实验环境1硬件环境:PC机2软件环境:Windows操作系统,VC+集成开发环境五、算法设
4、计思想六、主要问题与解决方法七、实验结果以下是程序的用户运行界面截图:八、体会、质疑、建议九、源代码 #include<stdio.h>#include<fstream>#include<iostream>#include<vector>#include<string>#include<windows.h>#include<iterator>#include<algorithm>using namespace std;typedef struct s/DFA的结构体char A;char B;cha
5、r C;node;struct token/单词序列的结构体string type;int code;void gotoxy(int x,int y)/光标转移函数COORD coord;coord.X=x;coord.Y=y;SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );char def(char c)/判断读入的单个字符的类型char num="0123456789"char ch="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ
6、RSTUVWXYZ"char sym="+-=:;,'"vector<char> vecnum(num,num+strlen(num);vector<char> vecch(ch,ch+strlen(ch);vector<char> vecsym(sym,sym+strlen(sym);if(find(vecnum.begin(),vecnum.end(),c)!=vecnum.end()return 'd'else if(find(vecch.begin(),vecch.end(),c)!=vecch.
7、end()return 'c'else if(find(vecsym.begin(),vecsym.end(),c)!=vecsym.end()return 'k'else return 0;void InputDFA(vector<node> &DFA)int cnt=0;char endget;node t;cout<<"请输入DFA,字符间用空格分隔:n"docin>>t.A;cin>>t.B;cin>>t.C;DFA.push_back(t);cnt+;cout<
8、;<"是否结束输入?(Y/N):"cin>>endget;gotoxy(0,cnt+1);cout<<" "gotoxy(0,cnt+1);while(endget!='Y');void ImplyDFA(vector<node> &DFA)node t;FILE*dfa_in;if(dfa_in=fopen("dfadata.txt","r")=NULL)cout<<"文件打开错误!n"exit(0);while(!
9、feof(dfa_in)t.A=fgetc(dfa_in);fgetc(dfa_in);t.B=fgetc(dfa_in);fgetc(dfa_in);t.C=fgetc(dfa_in);fgetc(dfa_in);DFA.push_back(t);fclose(dfa_in);void recognize(const vector<node> &DFA,vector<token> &tch)token t;char a;char start;/打开程序串文件FILE*in;if(in=fopen("programdemo.txt",
10、"r")=NULL)cout<<"文件打开错误!n"exit(0);start=DFA0.A;vector<node>:const_iterator iter=DFA.begin();while(!feof(in)while(def(a=fgetc(in)for(iter=DFA.begin();iter!=DFA.end();iter+)if(start=(*iter).A&&def(a)=(*iter).B)/若DFA配对成功,则将单个字符合并到已识别串中,作为单词的一部分t.type=t.type+a;sta
11、rt=(*iter).C;/对DFA状态转换break;if(iter=DFA.end()break;if(t.type!="")tch.push_back(t);/处理空格和换行符的情况if(def(a)='k')t.type=a;tch.push_back(t);start=DFA0.A;/恢复开始状态t.type.erase();/识别完一个单词,识别串存储空间清零fclose(in);void fillcode(vector<token> &tch)int sign=0;vector<string> keyword;/
12、存储语言的关键字keyword.push_back("var");/写入关键字keyword.push_back("begin");keyword.push_back("end");keyword.push_back("str");keyword.push_back("integer");for(int jcnt=0;jcnt<tch.size();jcnt+)sign=0;for(int icnt=0;icnt<keyword.size();icnt+)/对关键字进行处理if(tc
13、hjcnt.type=keywordicnt)tchjcnt.code=icnt+1;sign=1;break;if(sign=0)if(def(tchjcnt.type0)='d')/对整数进行处理tchjcnt.code=8;else if(def(tchjcnt.type0)='c')/对标识符进行处理tchjcnt.code=7;else if(def(tchjcnt.type0)='k')/对界符进行处理tchjcnt.code=6;if(jcnt>0&&tchjcnt-1.type="'&quo
14、t;&&tchjcnt+1.type="'")/对字符串常量进行处理tchjcnt.code=9;void write(const vector<token> &tch)cout<<"识别得到单词序列如下:n"vector<token>:const_iterator iter1=tch.begin();for(;iter1!=tch.end();iter1+)cout<<'('<<(*iter1).type<<','<<(*iter1).code<<')'<<endl;void main()int cnt=0,choice=2;/读入DFAvector<node> DFA;cout<<"请选择DFA:n1、手动
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论