《编译原理》词法分析实验报告模板-课程上机_第1页
《编译原理》词法分析实验报告模板-课程上机_第2页
《编译原理》词法分析实验报告模板-课程上机_第3页
《编译原理》词法分析实验报告模板-课程上机_第4页
《编译原理》词法分析实验报告模板-课程上机_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE1实验报告课程名称编译原理实验项目设计与实现一个词法编译器实验仪器PC机一台北京信息科技大学信息管理学院(课程上机)实验报告实验名称设计与实现一个词法编译器实验地点3-603实验时间2011.11.23实验目的:结合讲授内容,设计与实现一个简单词法编译器,通过本实验加深对词法分析程序的功能及实现方法的理解。实验内容:设计与实现一个简单词法编译器。具体内容是产生一个二元式文本文件,扩展名为txt,可将Pascal程序(测试程序)分解成为一个一个的单词及类别。实验要求:(1)掌握和实现词法分析器的功能:输入源程序,输出单词符号(二元式表示)。二元式(单词流)源程序(字符流)词法分析器输入输出二元式(单词流)源程序(字符流)词法分析器(2)单词符号的分类:关键字:是由程序语言定义的具有固定意义的标识符。标识符:用来表示各种名字,如变量等。常数:常数的类型有整型,实型等。运算符:算术运算符,关系运算符,逻辑运算符。界限符:逗号,分号等。(3)实验步骤:1、确定词法分析器的接口关系;2、设计算法参考教材图2.5。实验准备:1:pc机一台;2:VC++编译器实验过程:1,分析问题输入源程序,输出单词符号(二元式表示)。二元式(单词流)源程序(字符流)词法分析器二元式(单词流)源程序(字符流)词法分析器2,算法步骤::将文件中每行读入的字符串存入数组buffer[100],不跳过空格;:利用构造函数传递数组,和每行的长度length;:调用成员函数scan,i=0,while(i<length)开始检测buffer的字符;:if(isletter(),接收完成后比较是否为关键字,不是则将其存入标示符id[50][10]中;:elseif(isdigit()),接收完成后存入cst[50][10]中;:elseif为界符,比较符,运算符,输出对应的二元编码;:接受完毕,输出id[50][10]--标示符,cst[50][10]--常数,列表;3:程序代码#include<iostream.h>#include<fstream.h>#include<string.h>intm=0;intn=0;intx[50],y[50];//存放对应常数表和字母表每列的长度。char*reservechar[]={"PROGRAM","CONST","VAR","INTEGER","LONG","PROCEDURE","IF","THEN","WHILE","DO","READ","WRITE","BEGIN","END","ODD"};//指针数组地址每次加1读取下一个字符串//关键字表charid[50][10];//符号表charcst[50][10];//常数表classScanner{private:inti,j;//指针intlength;charch,buffer[100],strtoken[20];public:Scanner(charstr[],intn);//构造函数intisdigit();//判断是否整数intisletter();//首字母的判断intreserve();//对stroken进行关键字表的查找,返回其编码值intinsertid();//将stroken中的标识符插入符号表,返回在符号表中的位置intinsertconst();//将stroken中的常数插入常数表,返回在常数表中的位置voidgetchar();//将下一输入字符读到ch中,指针后移一字符位置voidgetbc();//保证ch是一个非空白字符voidconcat();//将ch连接到字符串stroken的末尾voidretract();//置ch为空白字符,指针前移一字符位置voidscan();};Scanner::Scanner(charstr[],intn)//构造函数{strcpy(buffer,str);length=n;i=j=0;}intScanner::isdigit()//判断是否整数{if(ch>='0'&&ch<='9')return1;elsereturn0;}intScanner::isletter()//首字母的判断{if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))return1;elsereturn0;}voidScanner::getchar()//将下一输入字符读到ch中,指针后移一字符位置{ch=buffer[i];i++;}voidScanner::getbc()//保证ch是一个非空白字符{while(ch=='')getchar();}voidScanner::concat()//将ch连接到字符串stroken的末尾{strtoken[j]=ch;j++;}voidScanner::retract()//置ch为空白字符,指针前移一字符位置{ i--;}intScanner::reserve()//对stroken进行关键字表的查找,返回其编码值{inti,flag=0;for(i=0;i<15;i++){if((strncmp(reservechar[i],strupr(strtoken),j)==0)&&(j!=1))//比较出错第一个interger和i无法区分{flag=1;break;}}if(flag==1)returni+1;elsereturn0;}intScanner::insertid()//将stroken中的标识符插入符号表,返回在符号表中的位置{for(inta=0;a<j;a++)id[m][a]=strtoken[a];x[m]=j;m++;returnm;}intScanner::insertconst()//将stroken中的常数插入常数表,返回在常数表中的位置{for(inti=0;i<j;i++)cst[n][i]=strtoken[i];y[n]=j;n++;returnn;}voidScanner::scan(){while(i<length){j=0;//自动清0,让strtoken重置intcode,value;getchar();//{ch=buffer[i];i++;}getbc();//{while(ch=='')getchar();}if(isletter())//如果打头的是字母{while(isletter()||isdigit()){concat();//将ch连接到字符串stroken的末尾getchar();}retract();//{i--;}code=reserve();//检测是否是关键字if(code==0)//如果扫描到的是标识符{value=insertid();cout<<"<字母位置,"<<value<<"行>"<<'\n';//表示字母所在数组的位置}elsecout<<"<"<<code<<",关键字>"<<'\n';//如果扫描到的是关键字}elseif(isdigit())//如果打头的是数字{while(isdigit()){concat();getchar();}retract();value=insertconst();cout<<"<数字位置,"<<value<<"行>"<<'\n';}elseif(ch=='+')cout<<"<16__+,*>"<<'\n';elseif(ch=='-')cout<<"<17__-,*>"<<'\n';elseif(ch=='*')cout<<"<18--*,*>"<<'\n';elseif(ch=='/')cout<<"<19--/,*>"<<'\n';elseif(ch=='=')cout<<"<20--=,*>"<<'\n';elseif(ch=='<'){getchar();if(ch=='>')cout<<"(21--<>,*)"<<'\n';elseif(ch=='=')cout<<"(23--<=,*)"<<'\n';else{retract();cout<<"(22--<,*)"<<'\n';}}elseif(ch=='>'){getchar();if(ch=='=')cout<<"(25-->=,*)"<<'\n';else{retract();cout<<"(24-->,*)"<<'\n';}}elseif(ch=='.')cout<<"<26--.,*>"<<'\n';elseif(ch==',')cout<<"<27--,,*>"<<'\n';elseif(ch==';')cout<<"<28--;,*>"<<'\n';elseif(ch==':'){getchar();if(ch=='=')cout<<"<30--:=,*>"<<'\n';else{retract();cout<<"<29--:,*>"<<'\n';}}elseif(ch=='(')cout<<"<31--(,*>"<<'\n';elseif(ch==')')cout<<"<32--),*>"<<'\n';elsecout<<"出错"<<'\n';}}voidmain(void){fstreamfile;file.open("D:\\pl.txt",ios::in||ios::nocreate);//以只读方式打开file.unsetf(ios::skipws);//不跳过文本中的空格charbuffer[100];//缓冲区定义cout<<"扫描结果如下所示"<<'\n';while(file.getline(buffer,100))//while每次接收一行字符。{ScannerSS(buffer,strlen(buffer));SS.scan();}cout<<"标识符表如下:\n"<<"编号\t"<<"值\n";for(inti=0;i<m;i++){cout<<i+1<<'\t';for(intj=0;j<x[i];j++)cout<<id[i][j];cout<<'\n';}

温馨提示

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

评论

0/150

提交评论