编译原理词法分析实验一-词法分析扫描器的设计实现.doc_第1页
编译原理词法分析实验一-词法分析扫描器的设计实现.doc_第2页
编译原理词法分析实验一-词法分析扫描器的设计实现.doc_第3页
编译原理词法分析实验一-词法分析扫描器的设计实现.doc_第4页
编译原理词法分析实验一-词法分析扫描器的设计实现.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

编译原理程序设计实验报告实验题目班级:计算机1306姓名:学号:289实验目标:词法分析扫描器的设计实现实验内容:1. 概要设计1) 主函数:每次从文件中读取一个字符,不是#,继续判断其是否是09数字,是进入isnumber()函数,否继续判断其是否是az或AZ,是进入isalpha()函数,否继续判断是否是空格或换行符,是继续读下一个字符,否进入isother()函数。2) Isnumber():读字符,将数字(包括小数点)全部接收,并存入常数表。3) Isalpha():读字符,将az或AZ(包括下划线)全部接收,与关键字表比较,匹配,输出序号,否则存入标识符表。4) Isother():读字符,将符号都接受,与界符表比较,匹配输出序号,遇到”或分别存入字符表和字符串表。2. 流程图 开始从文件读一个字符结束 #? T F进入函数Isnumber() 09? T F进入函数isAlpha()az或AZ? T空格或/n? F F进入isOther()3. 关键函数void IsNumber(); /读的是数字void IsAlpha(); /读的是关键字和标示符int IsOther();/读字符、字符串、界符源程序代码:(加入注释)#include#include#include #include using namespace std;/*定义结构体*/typedef struct Token char name20; int state; /状态,为0是标识符,为1是字符,为2是字符串,为3是数字,为4是关键字,为5是界符 Token;typedef struct STR / char name20; int code;STR;STR iT10;STR cT20;STR sT20;STR CT20;STR KT10=int,4,main,5,void,6,if,7,else,8,char,9;STR PT30=,10,14,15,+,16,-,17,*,18,/,19, ,20,21,22,;,23,(,24,),25, ,26,27;/*全局变量声明*/Token CurrentToken; /正在读的tokenToken token200;FILE *fp; /源文件指针char ch; /读取字符int state=0;/0表示标识符,1表示字符,2表示字符串int iT_i=0;/iT结构体数组下标int cT_i=0;int sT_i=0;int CT_i=0;int index=0;/token的下标/*函数声明*/void IsNumber(); /读的是数字void IsAlpha(); /读的是字母,关键字和标示符int IsOther();/,;+-/*主函数*/int main() int i =0; if(fp=fopen(source.txt,r)=NULL) coutcan not open the source file!nendl; exit(1); ch=fgetc(fp); /文件中读一个字符 while(ch!=#) for(i=0; i=0)&(ch=a)&(ch=A)&(ch=Z)|(ch=_) /关键字和标识符 IsAlpha(); else if(ch= |ch=n) ch=fgetc(fp); else IsOther(); coutendl; for(i=0;i=index;i+) ; coutendl; coutfinish=0)&(ch=9) CurrentTk+=ch;/将数字放入单词缓冲区 ch=fgetc(fp); bool flag=1; if(ch=.) CurrentTk+=ch; ch=fgetc(fp); if(ch9) CurrentTk+=ch; flag=0; else while(ch=0)&(ch=9) CurrentTk+=ch;/将数字放入单词缓冲区 ch=fgetc(fp); if(flag=1) strcpy(CTCT_i+.name,CurrentT);strcpy(,CurrentT );tokenindex+.state=3; /coutCurrentT endl; cout ; else coutCurrentT =a)&(ch=A)&(ch=Z)|ch=_)/将完整的单词放入单词缓冲区 CurrentTi+=ch; ch=fgetc(fp); flag=0; /判断是否是关键字 for(i=0;i7;i+) if(strcmp(CurrentT,KT)=0) flag=1; /printf(%s n,CurrentT,KTi.code);strcpy(,CurrentT);tokenindex+.state =4; printf( ,KTi.code); break; if(flag!=1) while(ch=a)&(ch=A)&(ch=0)&(ch=9) CurrentTi+=ch; ch=fgetc(fp); /printf(%s n,CurrentT); printf( );strcpy(,CurrentT);tokenindex+.state =0;int tag=0;for(int j=0;jiT_i;j+)if(strcmp(CurrentT,iT)=0)tag=1;break;if(tag=0) strcpy(iTiT_,CurrentT); iTiT_i+.code=0; /*其它 */int IsOther() int i; for(i=0; i: CurrentT0=; flag=1; ch=fgetc(fp); if(ch =) CurrentT1=; ch=fgetc(fp); break; else break; case: CurrentT0=a&ch=A&ch=Z) CurrentT1=ch; ch=fgetc(fp); if(ch=) CurrentT2=; cout ; strcpy(,CurrentT); tokenindex+.state =1; int tag=0; for(int j=0;j=cT_i;j+) if(strcmp(cTcT_ ,CurrentT )=0) tag=1; if(tag=0) strcpy(cTcT_i+.name,CurrentT); ch=fgetc(fp); return 0; else couterror1; exit(1); else cout=a&ch=A&ch=Z) CurrentTj+=ch; ch=fgetc(fp); if(ch=) CurrentTj+=; cout ; strcpy(,CurrentT); tokenindex+.state =1; int tag=0; for(int j=0;j=sT_i;j+) if(strcmp(sTsT_ ,CurrentT )=0) tag=1; if(tag=0) strcpy(sTsT_i+.name,CurrentT); ch=fgetc(fp); return 0; else couterror3; exit(1); if(CurrentT0!=0) for(i=0;i20;i+) if(strcmp(CurrentT,PT)=0) /printf(%s n,CurrentT,PTi.code); printf( ,PTi.code);strcpy( ,CurrentT );tokenindex+.state =PTi.code; b

温馨提示

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

评论

0/150

提交评论