编译原理语法分析器报告.docx
- 文档编号:2397937
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:22
- 大小:91.82KB
编译原理语法分析器报告.docx
《编译原理语法分析器报告.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析器报告.docx(22页珍藏版)》请在冰豆网上搜索。
编译原理语法分析器报告
昆明理工大学信息工程与自动化学院学生实验报告
(2011—2012学年第1学期)
课程名称:
编译原理开课实验室:
信自楼机房4442011年11月14日
年级、专业、班
学号
姓名
成绩
实验项目名称
简单样本语言的词法分析器
指导教师
教
师
评
语
该同学是否了解实验原理:
A.了解□B.基本了解□C.不了解□
该同学的实验能力:
A.强□B.中等□C.差□
该同学的实验是否达到要求:
A.达到□B.基本达到□C.未达到□
实验报告是否规范:
A.规范□B.基本规范□C.不规范□
实验过程是否详细记录:
A.详细□B.一般□C.没有□
教师签名:
年月日
一、实验目的及内容
实验目的:
理解语言分析在编译过程中的作用、输入以及输出,学习它与编译器其它模块之间的协作关系。
掌握语法分析的两类基本方法:
自上而下的分析与自下而上的分析,并通过对自上而下的分析的编码实现,理解其执行过程以及相关限制。
实验内容:
实现下述我们定义的语言的语法分析器。
这种语言的程序结构很简单,语法相当于c的函数体,即由一对大括号括起来的语句序列,没有过程或函数。
声明语句、表达式语句及控制语句的写法都与c类似,但规定:
一条声明语句只能声明一个整型变量,没有数组;控制语句只是if、for和while三个语句,这三个语句本身也可以包含语句序列;表达式仅局限于布尔表达式和整型算术表达式,布尔表达式由对两个算术表达式的比较组成,该比较使用<,>,<=,>=,==,!
=比较运算符;算术表达式可以包括整型常数、变量以及+,-,*,/这四个运算符。
另外,还可以有复合语句。
用read和write语句实现输入输出。
注释用/*和*/括起来,但注释不能嵌套。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
语法分析器流程图:
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC以及VISUALC++6.0软件。
四、实验方法、步骤(或:
程序代码或操作过程)
#include
#include
#include
#include
#definemaxvartablep500
#definekeywordsum8
intparse();
intprogram();
intstatement();
intexpression_stat();
intexpression();
intbool_expr();
intadditive_expr();
intterm();
intfactor();
intif_stat();
intwhile_stat();
intfor_stat();
intwrite_stat();
intread_stat();
intdeclaration_stat();
intdeclaration_list();
intstatement_list();
intcompound_stat();
chartoken[20],token1[40];//token保存单词符号,token1保存单词值
char*keyword[keywordSum]={"if","else","for","while","do","int","read","write"};
charsingleword[50]="+-*(){};,:
";
chardoubleword[10]="><=!
";
externcharScanout[300];
FILE*fp;
intscan();
charScan[300],Errorfile[300];
externintscan();
externintparse();
charScanin[300],Scanout[300];//用于接收输入输出文件名
FILE*fin,*fout;
struct{
charname[8];
intaddress;
}
vartable[maxvartablep];//改符号表最多容纳maxvartablep个记录
intvartablep=0,labelp=0,datap=0;
intlookup(char*name,int*paddress)
{
inti,es=0;
for(i=0;i { if(strcmp(vartable[i].name,name)==0) { *paddress=vartable[i].address; return(es); } } es=23;//变量没有声明 return(es); } intfscan()//词法分析函数 { charch,token[40]; intes=0,j,n;//es错误代码,0表示没有错误。 j,n为临时变量,控制组合单词时的下标等 printf("================================\n"); printf("************语法分析************\n"); printf("================================\n"); printf("请输入源文件的地址和文件名(格式: X(盘): /……/xxx.xx(文件)): \n"); scanf("%s",Scanin); printf("你想把分析结果放在哪(包含文件名): \n"); scanf("%s",Scanout); if((fin=fopen(Scanin,"r"))==NULL) { printf("n打开语法分析输入文件出错! \n"); return (1); } if((fout=fopen(Scanout,"w"))==NULL) { printf("n创建语法分析输出文件出错! \n"); return (2); } ch=getc(fin); while(ch! =EOF) { while(ch==''||ch=='n'||ch=='t')ch=getc(fin); if(ch==EOF)break; if(isalpha(ch)) { token[0]=ch;j=1; ch=getc(fin); while(isalnum(ch)) { token[j++]=ch; ch=getc(fin); } n=0; while((n if(n>=keywordSum) fprintf(fout,"%st%sn","ID",token); else fprintf(fout,"%st%sn",token,token); } elseif(isdigit(ch)) { token[0]=ch;j=1; ch=getc(fin); while(isdigit(ch)) { token[j++]=ch; ch=getc(fin); } fprintf(fout,"%st%sn","NUM",token); } elseif(strchr(singleword,ch)>0) { ch=getc(fin); fprintf(fout,"%st%sn",token,token); } elseif(strchr(doubleword,ch)>0) { token[0]=ch; ch=getc(fin); if(ch=='=') { ch=getc(fin); } else fprintf(fout,"%st%sn",token,token); } elseif(ch=='/') { ch=getc(fin); if(ch=='*') { charch1; ch1=getc(fin); do { ch=ch1;ch1=getc(fin);} while((ch! ='*'||ch1! ='/')&&ch1! =EOF); ch=getc(fin); } else { fprintf(fout,"%st%sn",token,token); } } else { ch=getc(fin); es=3; fprintf(fout,"%st%sn","ERROR",token); } } fclose(fin); fclose(fout); return(es); } intparse() { intes=0; if((fp=fopen(Scanout,"r"))==NULL) { printf("\n打开%s错误! \n",Scanout); es=10; } if(es==0)es=program(); printf("=====语法分析结果! ======\n"); switch(es) { case0: printf("语法分析成功! \n");break; case10: printf("打开文件%s失败! \n",Scanout);break; case1: printf("缺少{! \n");break; case2: printf("缺少}! \n");break; case3: printf("缺少标识符! \n");break; case4: printf("少分号! \n");break; case5: printf("缺少(! \n");break; case6: printf("缺少)! \n");break; case7: printf("缺少操作数! \n");break; } fclose(fp); return(es); } //<程序>: : ={<声明序列><语句序列>} //program: : ='{' intprogram() { intes=0; fscanf(fp,"%s%s\n",token,token1); printf("%s%s\n",token,token1); if(strcmp(token,"{"))//判断是否'{' { es=1; return(es); } fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法 分析器 报告