《2022年编译原理-语法分析器报告 .pdf》由会员分享,可在线阅读,更多相关《2022年编译原理-语法分析器报告 .pdf(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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
25、%sn,&token,&token1); printf(%s %sn,token,token1); es=statement(); if (es0) return(es); fprintf(fout,LABEL%d:n,label2);/设置 label2 记住的标号名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 29 页 - - - - - - - - - -16- return(es); /:=while() /:= while () int while_stat(
26、) int es=0,label1,label2; label1=labelp+; fprintf(fout,LABEL%d:n,label1);/设置 label1 标号 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); if (strcmp(token,() return(es=5); /少左括号 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0) return(es); if (strcm
27、p(token,) return(es=6); /少右括号 label2=labelp+; fprintf(fout, BRF LABEL%dn,label2);/输出假转移指令 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=statement(); if (es0) return(es); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 29 页 - - - - - - - - -
28、-17- fprintf(fout, BR LABEL%dn,label1);/输出无条件转移指令 fprintf(fout,LABEL%d:n,label2);/设置 label2 标号 return(es); /:=for(;) /:= for(,) int for_stat() int es=0,label1,label2,label3,label4; fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); if (strcmp(token,() return(es=5); /少左括号 fscanf(fp,%s %sn
29、,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0) return(es); if (strcmp(token,;) return(es=4); /少分号 label1=labelp+; fprintf(fout,LABEL%d:n,label1);/设置 label1 标号 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0) return(es); 名师资料总结 - - -精品
30、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 29 页 - - - - - - - - - -18- label2=labelp+; fprintf(fout, BRF LABEL%dn,label2);/输出假条件转移指令 label3=labelp+; fprintf(fout, BR LABEL%dn,label3);/输出无条件转移指令 if (strcmp(token,;) return(es=4); /少分号 label4=labelp+; fprintf(fout,LABEL%d:
31、n,label4);/设置 label4 标号 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0) return(es); fprintf(fout, BR LABEL%dn,label1);/输出无条件转移指令 if (strcmp(token,) return(es=6); /少右括号 fprintf(fout,LABEL%d:n,label3);/设置 label3 标号 fscanf(fp,%s %sn,&token,&token1); printf(%s %s
32、n,token,token1); es=statement(); if (es0) return(es); fprintf(fout, BR LABEL%dn,label4);/输出无条件转移指令 fprintf(fout,LABEL%d:n,label2);/设置 label2 标号 return(es); /:=write ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 29 页 - - - - - - - - - -19- /:=write ; int wri
33、te_stat() int es=0; fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0)return(es); if (strcmp(token,;) return(es=4); /少分号 fprintf(fout, OUTn);/输出指令 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); return(es); /:=read ; /:=read ID; int read_stat() in
34、t es=0,address; fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); if (strcmp(token,ID) return(es=3); /少标识符 es=lookup(token1,&address); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 29 页 - - - - - - - - - -20- if (es0) return(es); fprintf(fout, IN
35、 n);/输入指令 fprintf(fout, STI %dn,address);/指令 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); return(es); /:= /:= int compound_stat() /复合语句函数 int es=0; fscanf(fp,%s %sn,&token,&token1)
36、; printf(%s %sn,token,token1); es=statement_list(); return(es); /:=;|; /:=;|; int expression_stat() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 29 页 - - - - - - - - - -21- int es=0; if (strcmp(token,;)=0) fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,toke
37、n,token1); return(es); es=expression(); if (es0) return(es); if (strcmp(token,;)=0) fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); return(es); else es=4; return(es);/少分号 /:=| /:=ID=| 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 29 页 - - - - -
38、 - - - - -22- int expression() int es=0,fileadd; char token220,token340; if (strcmp(token,ID)=0) fileadd=ftell(fp); /ASSIGN记住当前文件位置 fscanf(fp,%s %sn, &token2,&token3); printf(%s %sn,token2,token3); if (strcmp(token2,=)=0) /= int address; es=lookup(token1,&address); if (es0) return(es); fscanf(fp,%s
39、%sn,&token,&token1); printf(%s %sn,token,token1); es=bool_expr(); if (es0) return(es); fprintf(fout, STO %dn,address); else fseek(fp,fileadd,0); /若非= 则文件指针回到 = 前的标识符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 29 页 - - - - - - - - - -23- printf(%s %sn,token,
40、token1); es=bool_expr(); if (es0) return(es); else es=bool_expr(); return(es); /:=|(|=|=|=|!=) /:= / |(|=|=|=|!=) int bool_expr() int es=0; es=additive_expr(); if(es0) return(es); if ( strcmp(token,)=0 | strcmp(token,=)=0 |strcmp(token,)=0 | strcmp(token,0) return(es); if ( strcmp(token2,)=0 ) fprin
41、tf(fout, GTn); if ( strcmp(token2,=)=0 ) fprintf(fout, GEn); if ( strcmp(token2,)=0 ) fprintf(fout, LESn); if ( strcmp(token2,=)=0 ) fprintf(fout, LEn); if ( strcmp(token2,=)=0 ) fprintf(fout, EQn); if ( strcmp(token2,!=)=0 ) fprintf(fout, NOTEQn); return(es); /:=(+|-) /:=(+|-) int additive_expr() i
42、nt es=0; es=term(); if(es0) return(es); while (strcmp(token,+)=0 | strcmp(token,-)=0) char token220; strcpy(token2,token); fscanf(fp,%s %sn,&token,&token1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 24 页,共 29 页 - - - - - - - - - -25- printf(%s %sn,token,token1);
43、 es=term(); if(es0) return(es); if ( strcmp(token2,+)=0 ) fprintf(fout, ADDn); if ( strcmp(token2,-)=0 ) fprintf(fout, SUBn); return(es); /:=(*|/) /:=(*| /) int term() int es=0; es=factor(); if(es0) return(es); while (strcmp(token,*)=0 | strcmp(token,/)=0) char token220; strcpy(token2,token); fscanf
44、(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=factor(); if(es0) return(es); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 25 页,共 29 页 - - - - - - - - - -26- if ( strcmp(token2,*)=0 ) fprintf(fout, MULTn); if ( strcmp(token2,/)=0 ) fprintf(fout, DIVn);
45、return(es); /:=()| /:=()| ID|NUM int factor() int es=0; if (strcmp(token,()=0) fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); es=expression(); if (es0) return(es); if (strcmp(token,) return(es=6); /少右括号 fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); else if (strcmp(to
46、ken,ID)=0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 26 页,共 29 页 - - - - - - - - - -27- int address; es=lookup(token1,&address);/查符号表,获取变量地址 if (es0) return(es);/变量没声明 fprintf(fout, LOAD %dn,address); scanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1);
47、 return(es); if (strcmp(token,NUM)=0) fprintf(fout, LOADI %sn,token1); fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); return(es); else es=7;/缺少操作数 return(es); return(es); void main() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 27 页,共 29 页 - - - - -
48、 - - - - -28- int es=0; es=scan();/调词法分析 if (es0) printf(语法分析有错 , 编译停止 !); else printf(语法分析成功 !n); if (es=0) es=parse(); / 调语法分析if (es=0) printf(语法分析成功 !n); else printf(语法分析错误 !n); 五、实验过程原始记录 ( 测试数据、图表、计算等) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 28 页,共 29 页 -
49、 - - - - - - - - -29- 六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)语言分析在编译过程中的作用,输入以及输出,学习它与编译器其他模块之间的协作关系。语法分析器是编译器实现的第二步,常见的实现方法有自上而下的分析法和自下而上的分析法两种,其中,自上而下的分析法要求原语言服从LL(1)文法,故使用上具有一些限制,不过,由于自上而下的分析法效率很高,而且大部分语言稍加改造,就可以使用此法分析,因而的到了广泛应用。本次实验涉及自上而下的语法分析的实现过程,通过实验,我对语法分析有了更深刻的理解,有一定收获。注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 29 页,共 29 页 - - - - - - - - -