2023年词法分析的实验报告_第1页
2023年词法分析的实验报告_第2页
2023年词法分析的实验报告_第3页
2023年词法分析的实验报告_第4页
2023年词法分析的实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《词法分析》实验报告

目录TOC\o"1-3"\h\z\uHYPERLINK目录ﻩPAGEREF_Toc\h2HYPERLINK\l"_Toc"1实验目的 3HYPERLINK2实验内容 PAGEREF_Toc\h3HYPERLINK\l"_Toc"2.1TINY计算机语言描述ﻩPAGEREF_Toc\h3HYPERLINK3此法分析器的程序实现ﻩPAGEREF_Toc\h4HYPERLINK\l"_Toc"3.1状态转换图 PAGEREF_Toc\h4HYPERLINK\l"_Toc"3.2程序源码ﻩPAGEREF_Toc\h5HYPERLINK\l"_Toc"3.3实验运营效果截图ﻩPAGEREF_Toc\h10HYPERLINK\l"_Toc"4实验体会 PAGEREF_Toc\h10

实验目的1、学会针对DFA转换图实现相应的高级语言源程序。2、深刻领略状态转换图的含义,逐步理解有限自动机。3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。实验内容TINY计算机语言描述TINY计算机语言的编译程序的词法分析部分实现。从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表达(token)送给语法分析程序。为了简化程序的编写,有具体的规定如下:1、数仅仅是整数。2、空白符仅仅是空格、回车符、制表符。3、代码是自由格式。4、注释应放在花括号之内,并且不允许嵌套TINY语言的单词保存字特殊符号其他if+标记符(一个或更多的字母)then-else*end/repeat=数(一个或更多的数字)until<read{write};实验规定规定实现编译器的以下功能1、按规则拼单词,并转换成二元式形式2、删除注释行3、删除空白符(空格、回车符、制表符)4、列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式5、发现并定位错误词法分析进行具体的规定1、记号的二元式形式中种类采用枚举方法定义;其中保存字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表达的字符串值。2、词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号辨认其种类,收集该记号的符号串属性,当辨认一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前辨认出记号的属性值。这样配合语法分析程序的分析需要的记号及其属性,生成一个语法树。3、标示符和保存字的词法构成相同,为了更好的实现,把语言的保存字建立一个表格存储,这样可以把保存字的辨认放在标示符之后,用辨认出的标示符对比该表格,假如存在该表格中则是保存字,否则是一般标示符。此法分析器的程序实现状态转换图图1TINY语言的拟定有限自动机(DFA)程序源码#include<iostream>usingnamespacestd;#include<fstream>#include<string>#include<iomanip>classCA{public: voidgetToken();//辨认标记符 voidpreDo(char);//预解决源程序 voiddisplay();//打印出ﻩCA()ﻩ{ m=n=0; }private:ﻩlongcount2; charID[10][10];//符号表 intm;//设m为符号表中已有的标记符的个数ﻩcharCons[10][10];//常数表 intn;//设n为常数表中已有的常数的个数 charbuffer1[99999];ﻩboolisDigit(char);//检查是否为数字 boolisLetter(char);//检查是否为字符ﻩintInsertID(char*strToken);//添加符号ﻩintInsertConst(char*strToken);//添加符号ﻩintSearch(chara[][10],constchar*,int);//二分查找};//enumvariety{标记符,数字,关键字1,关键字2,关键字3,关键字4,关键字5,关键字6,关键字7,关键字8,特殊符号1,//特殊符号2,特殊符号3,特殊符号4,特殊符号5,特殊符号6,特殊符号7,特殊符号8,特殊符号9,特殊符号10};//关键字bi编码12345678charK[18][10]={"else","end","if","read","repeat","then","until","write", ﻩ ﻩ"%","*","+","-","/",":",";","<","=",">"};boolCA::isDigit(charc){ﻩif(c<='9'&&c>='0')returntrue; elsereturnfalse;}boolCA::isLetter(charc){ﻩif(c>='a'&&c<='z'||c>='A'&&c<='Z')returntrue;ﻩelsereturnfalse;}intCA::Search(chara[18][10],constchar*b,intn){ﻩintleft=0;intright=n-1;intmid=0;ﻩwhile(left<=right)ﻩ{ﻩ mid=(left+right)/2; if(strcmp(a[mid],b)==0)returnmid; elseif(strcmp(a[mid],b)<0)left=mid+1; ﻩelseright=mid-1; } return-1;}intCA::InsertID(char*strToken){ﻩinti=0; while(i<m)//设m为符号表中已有的标记符的个数 { if(!strcmp(ID[i],strToken))ﻩ ﻩreturni;ﻩ i++;ﻩ}ﻩstrcpy(ID[i],strToken); m++; returni;}intCA::InsertConst(char*strToken){ inti=0; while(i<n)//设n为常数表中已有的常数的个数 {ﻩ if(!strcmp(Cons[i],strToken)) ﻩreturni; ﻩi++;ﻩ}ﻩstrcpy(Cons[i],strToken);ﻩn++; returni;}voidCA::display(){ charfilename[30]; //输入的时候一定要是...:/.../...格式 cout<<"请输入源程序代码.cpp文献的绝对途径:"<<endl; cin>>filename;ﻩifstreaminfile(filename,ios::in);ﻩif(!infile)ﻩ{ﻩﻩcerr<<"openerror!"<<endl;ﻩ abort();ﻩ}ﻩcharch; intcount1=1;count2=0; cout<<"第"<<count1<<"行";ﻩwhile(infile.get(ch))ﻩ{ﻩﻩpreDo(ch); cout<<ch;//逐行打印出源程序 if(ch=='\n')ﻩ { count1++; ﻩﻩcout<<"第"<<count1<<"行";ﻩ } } buffer1[count2+1]='\0'; cout<<endl; //对buffer1中的字符进行扫描ﻩgetToken();ﻩinfile.close(); cout<<endl; cout<<"符号表:"; ﻩfor(inti=0;i<m;i++)ﻩ cout<<ID[i]<<""; cout<<endl;ﻩ cout<<"数字表:"; for(intj=0;j<n;j++) ﻩcout<<Cons[j]<<"";ﻩcout<<endl;}voidCA::preDo(charc){ﻩchar*p=buffer1; buffer1[0]='#';//赋#给扫描缓冲区的第一个元素 count2++; *(p+count2)=c;ﻩif(buffer1[count2-1]=='{')//删除注释 { ﻩif(c=='{')cout<<"注释不允许嵌套!";//注释不允许嵌套 ﻩif(c!='}')count2--;ﻩﻩelsecount2=count2-2; }ﻩelseif(buffer1[count2-1]==''&&c=='')count2--;//若干相继的空白符结合成一个ﻩif(c=='\r')count2--;ﻩif(c=='\t')count2--;}voidCA::getToken(){ﻩintn=1;ﻩcout<<"第1行:";ﻩfor(inti=1;i<strlen(buffer1);i++)ﻩ{ﻩﻩif(buffer1[i]=='\n'){n++;cout<<"\n第"<<n<<"行:";}ﻩﻩelseif(isLetter(buffer1[i])) ﻩ{ ﻩstringtok=""; ﻩﻩtok+=buffer1[i]; ﻩﻩwhile(isLetter(buffer1[++i])) ﻩ tok+=buffer1[i]; ﻩintr=Search(K,tok.c_str(),8);ﻩﻩ i--; ﻩﻩif(r!=-1)cout<<"(关键字"<<r+1<<","<<tok<<")";//关键字编码 ﻩﻩelseﻩ { ﻩ ﻩcout<<"(标记符,"<<tok<<")";//标记符编码 r=InsertID((char*)tok.c_str()); ﻩ } ﻩﻩﻩﻩ} elseif(isDigit(buffer1[i]))ﻩﻩ{ﻩ ﻩstringtok="";ﻩ tok+=buffer1[i]; ﻩ while(isDigit(buffer1[++i])) { tok+=buffer1[i]; ﻩ ﻩﻩﻩ} inty=InsertConst((char*)tok.c_str());ﻩﻩ cout<<"(数字,"<<tok<<")";ﻩﻩ i--;//数字编码ﻩ } elseif(buffer1[i]==''){} else {ﻩﻩ stringtok=""; tok+=buffer1[i];ﻩﻩﻩintq=Search(K,tok.c_str(),18);ﻩﻩﻩif(q!=-1){cout<<"(特殊符号,"<<tok<<")";}ﻩ ﻩelse ﻩ ﻩﻩ ﻩﻩcout<<"非法符号!";ﻩ } }}/***********************main函数*******************************/intmain(){ﻩCAca;ﻩca.display(); cout<<endl; return0;}实验运营效果截图实验体会本次实验是《编译技术

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论