2022年编译原理-语法分析器报告 .pdf
《2022年编译原理-语法分析器报告 .pdf》由会员分享,可在线阅读,更多相关《2022年编译原理-语法分析器报告 .pdf(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-1- 昆明理工大学信息工程与自动化学院学生实验报告( 2011 2012 学年第 1 学期 )课程名称:编译原理开课实验室:信自楼机房444 2011年 11 月 14 日年级、专业、班学号姓名成绩实验项目名称简单样本语言的词法分析器指导教师教师评语该同学是否了解实验原理:A.了解B. 基本了解C.不了解该同学的实验能力:A.强B. 中等C.差该同学的实验是否达到要求:A.达到B. 基本达到C.未达到实验报告是否规范:A.规范B. 基本规范C.不规范实验过程是否详细记录:A.详细B. 一般C.没有教师签名:年月日一、实验目的及内容实验目的: 理解语言分析在编译过程中的作用、输入以及输出,学习
2、它与编译器其它模块之间的协作关系。掌握语法分析的两类基本方法:自上而下的分析与自下而上的分析,并通过对自上而下的分析的编码实现,理解其执行过程以及相关限制。实验内容: 实现下述我们定义的语言的语法分析器。这种语言的程序结构很简单,语法相当于 c 的函数体,即由一对大括号括起来的语句序列,没有过程或函数。声明语句、表达式语句及控制语句的写法都与c 类似,但规定:一条声明语句只能声明一个整型变量,没有数组; 控制语句只是 if 、for 和 while 三个语句,这三个语句本身也可以包含语句序列;表达式仅局限于布尔表达式和整型算术表达式,布尔表达式由对两个算术表达式的比较组成,该比较使用 ,=,=
3、 =,!= 比较运算符;算术表达式可以包括整型常数、变量以及+,*,/这四个运算符。另外,还可以有复合语句。用read 和 write语句实现输入输出。注释用 /* 和*/ 括起来,但注释不能嵌套。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 29 页 - - - - - - - - - -2- 二、实验原理及基本技术路线图(方框原理图或程序流程图)语法分析器流程图:三、所用仪器、材料(设备名称、型号、规格等或使用软件)1 台 PC以及 VISUAL C+6.0软件。名
4、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 29 页 - - - - - - - - - -3- 四、实验方法、步骤(或:程序代码或操作过程)#include #include #include #include #define maxvartablep 500 #define keywordsum 8 int parse(); int program(); int statement(); int expression_stat(); int expression()
5、; int bool_expr(); int additive_expr(); int term(); int factor(); int if_stat(); int while_stat(); int for_stat(); int write_stat(); int read_stat(); int declaration_stat(); int declaration_list(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 29 页 - - - - - -
6、 - - - -4- int statement_list(); int compound_stat(); char token20,token140;/token保存单词符号, token1 保存单词值char *keywordkeywordSum= if,else,for,while,do,int,read,write; char singleword50=+-*();,:; char doubleword10=!; extern char Scanout300; FILE *fp; int scan(); char Scan300,Errorfile300; extern int sca
7、n(); extern int parse(); char Scanin300,Scanout300; /用于接收输入输出文件名FILE *fin,*fout; struct char name8; int address; vartablemaxvartablep;/改符号表最多容纳maxvartablep 个记录int vartablep=0,labelp=0,datap=0; int lookup(char *name,int *paddress) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
8、- - - - 第 4 页,共 29 页 - - - - - - - - - -5- int i,es=0; for(i=0;ivartablep;i+) if (strcmp(vartablei.name,name)=0) *paddress=vartablei.address; return(es); es=23;/变量没有声明 return(es); int fscan()/词法分析函数 char ch,token40; int es=0,j,n; /es错误代码, 0 表示没有错误。 j,n为临时变量,控制组合单词时的下标等 printf(=n); printf(*语法分析 *n);
9、printf(=n); printf(请输入源文件的地址和文件名(格式:X(盘) :/ /xxx.xx (文件) ) :n); scanf(%s,Scanin); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 29 页 - - - - - - - - - -6- printf(你想把分析结果放在哪(包含文件名) :n); scanf(%s,Scanout); if (fin=fopen(Scanin,r)=NULL) printf(n打开语法分析输入文件出错!n); r
10、eturn(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) token0=ch; j=1; ch=getc(fin); while(isalnum(ch) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
11、 - - 第 6 页,共 29 页 - - - - - - - - - -7- tokenj+=ch; ch=getc(fin); n=0; while (n=keywordSum) fprintf(fout,%st%sn,ID,token); else fprintf(fout,%st%sn,token,token); else if (isdigit(ch) token0=ch; j=1; ch=getc(fin); while (isdigit(ch) tokenj+=ch; ch=getc(fin); fprintf(fout,%st%sn,NUM,token); else if (s
12、trchr(singleword,ch)0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 29 页 - - - - - - - - - -8- ch=getc(fin); fprintf(fout,%st%sn,token,token); else if (strchr(doubleword,ch)0) token0=ch; ch=getc(fin); if (ch=) ch=getc(fin); else fprintf(fout,%st%sn,token,toke
13、n); else if (ch=/) ch=getc(fin); if (ch=*) char ch1; ch1=getc(fin); do 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 29 页 - - - - - - - - - -9- ch=ch1;ch1=getc(fin); while (ch!=* | ch1!=/)&ch1!=EOF); ch=getc(fin); else fprintf(fout,%st%sn,token,token); else ch
14、=getc(fin); es=3; fprintf(fout,%st%sn,ERROR,token); fclose(fin); fclose(fout); return(es); int parse() int es=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 29 页 - - - - - - - - - -10- if(fp=fopen(Scanout,r)=NULL) printf(n打开%s错误!n,Scanout); es=10; if (es=0)
15、es=program(); printf(=语法分析结果 !=n); switch(es) case 0: printf(语法分析成功 !n);break; case 10: printf(打开文件 %s 失败!n,Scanout);break; case 1: printf(缺少!n);break; case 2: printf(缺少!n);break; case 3: printf(缺少标识符 !n);break; case 4: printf(少分号 !n);break; case 5: printf(缺少(!n);break; case 6: printf(缺少)!n);break;
16、case 7: printf(缺少操作数 !n);break; fclose(fp); return(es); /:= 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 29 页 - - - - - - - - - -11- /program:= int program() int es=0; fscanf(fp,%s %sn,token,token1); printf(%s %sn,token,token1); if(strcmp(token,)/判断是否 es=1;
17、return(es); fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=declaration_list(); if (es0) return(es); es=statement_list(); if (es0) return(es); if(strcmp(token,)/判断是否 es=2; return(es); return(es); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共
18、 29 页 - - - - - - - - - -12- /:=| /:= /| / 改成:= int declaration_list() int es=0; while (strcmp(token,int)=0) es=declaration_stat(); if (es0) return(es); return(es); / :=int ;/:=int ID; int declaration_stat() int es=0; fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); if (strcmp(token,ID
19、) return(es=3); /不是标识符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 29 页 - - - - - - - - - -13- fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); if (strcmp(token,;) ) return(es=4); fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); r
20、eturn(es); /:=| /:=| / 改成:= int statement_list() int es=0; while (strcmp(token,) es=statement(); if (es0) return(es); return(es); /:=| / | /:= | 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 29 页 - - - - - - - - - -14- / | | int statement() int es=0; if (es=0
21、 & strcmp(token,if)=0) es=if_stat();/ if (es=0 & strcmp(token,while)=0) es=while_stat();/ if (es=0 & strcmp(token,for)=0) es=for_stat();/ / 可在此处添加 do 语句调用 if (es=0 & strcmp(token,read)=0) es=read_stat();/ if (es=0 & strcmp(token,write)=0) es=write_stat();/ if (es=0 & strcmp(token,)=0) es=compound_st
22、at();/ if (es=0 & (strcmp(token,ID)=0|strcmp(token,NUM)=0|strcmp(token,()=0) es=expression_stat();/ return(es); /:= if () else /:= if () else int if_stat() int es=0,label1,label2; /if fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
23、- - 名师精心整理 - - - - - - - 第 14 页,共 29 页 - - - - - - - - - -15- if (strcmp(token,() return(es=5); /少左括号 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0) return(es); if (strcmp(token,) return(es=6); /少右括号 label1=labelp+;/用 label1 记住条件为假时要转向的标号 fprintf(fout, BRF L
24、ABEL%dn,label1);/输出假转移指令 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=statement(); if (es0) return(es); label2=labelp+;/用 label2 记住要转向的标号 fprintf(fout, BR LABEL%dn,label2);/输出无条件转移指令 fprintf(fout,LABEL%d:n,label1);/设置 label1 记住的标号 if (strcmp(token,else)=0)/else部分处理 fscanf(fp,%s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年编译原理-语法分析器报告 2022 编译 原理 语法 分析器 报告
限制150内