中间代码生成实验报告.docx

上传人:牧羊曲112 文档编号:3224912 上传时间:2023-03-11 格式:DOCX 页数:14 大小:41.46KB
返回 下载 相关 举报
中间代码生成实验报告.docx_第1页
第1页 / 共14页
中间代码生成实验报告.docx_第2页
第2页 / 共14页
中间代码生成实验报告.docx_第3页
第3页 / 共14页
中间代码生成实验报告.docx_第4页
第4页 / 共14页
中间代码生成实验报告.docx_第5页
第5页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《中间代码生成实验报告.docx》由会员分享,可在线阅读,更多相关《中间代码生成实验报告.docx(14页珍藏版)》请在三一办公上搜索。

1、中间代码生成实验报告一 、 实验目的 通过在实验二的基础上,增加中间代码生成部分,使程序能够 对实验二中的识别出的赋值语句,if语句和while语句进行语义分析,生成四元式中间代码。 二 、 实验方法 实验程序由c语言完成,在Turboc 2.0环境中调试通过。 语义分析程序的基本做法是对文法中的每个产生式分别编写一个语义分析子程序,当程序语法部分进行推倒或规约时,就分别调用各自的语义分析程序。当语法分析结束时,语义分析也就结束了。 在本实验程序中,当语法分析部分识别出语法正确的句子时,就进入content函数,然后根据句子的类型进行分类,进入不同的语义处理部分。 对于赋值语句,关键是产生正确

2、的处理算术表达式E的四元式。程序中的ec函数的功能就是产生算术表达式的四元式,在ec函数中使用了两个栈idshed,opshed,分别是算术表达式的数据栈和符号栈。每次提取一个数字和一个算符,然后将算符与与栈顶算符进行优先级比较,优先级高则将单前数字和算符进栈,低或者相等的话则将当前栈顶元素进行合并,产生四元式。直至整个算术表达式结束。其中还有一些细节问题,具体的做法可以参看程序。 对于实验给定的if语句的文法格式,条件判断式C只中可能是或者89+56*67 then f:=7*7+4; ff:=6+6*6-6%4+8; if sl+78*7689*56+67 then while a-798

3、+45*45 do f:=7*7+4; . 四 、 运行结果 首先对测试程序进行语法分析,识别出正确的句子,当识别出正确的句子时,就对当前句子进行语义分析,而语法不正确的句子不进行语义分析。 ff:=6+6*6- Error(4):Except ID or NUM ; Error(2):Syntax error if sl89+56*67 then f:=7*7+4; success! (1) *, 56, 67, T1 (2) +, 89, T1, T2 (3) j, sl, T2, (4) (4) *, 7, 7, T3 (5) +, T3, 4, T4 (6) :=, T4, -, f

4、ff:=6+6*6-6%4+8; success! (7) *, 6, 6, T5 (8) +, 6, T5, T6 (9) %, 6, 4, T7 (10) -, T6, T7, T8 (11) +, T8, 8, T9 (12) :=, T9, -, ff if sl+78*7689*56+67 then while a-798+45*45 do f:=7*7+4; success! (13) *, 78, 76, T10 (14) +, sl,T10, T11 (15) *, 89, 56, T12 (16) +,T12, 67, T13 (17) j, T11, T13, (18) (

5、18) -, a, 7, T14 (19) *, 45, 45, T15 (20) +, 98,T15, T16 (21) j, T14, T16, (22) (22) *, 7, 7, T17 (23) +,T17, 4, T18 (24) :=, T18, -, f (25) j, _, _, (18) . Error(2):Syntax error 五 、 实验小结 终于完成了编译原理的三次实验,这几次实验使我们更彻底地巩固了编译原理。从詷法分析到语法分析直到这次的中间代码都是看似简单的基础知识,却花了不少时间对课本多次反复研究、请教学习,进行深层次地探讨才找出编程时出现的种种问题。还有

6、很多程序方面很细节的问题,很容易被突略,却往往又是关键。 总地来说,虽然实验做得很辛苦,但真的可以从实验当中学习到很多,认识到很多。并对编译理解也透彻了许多,比较清晰地掌握了编译程序的原理和方法。 附录: #include #include #include #define reser 20 char *charstring=abcdefghijklmnopqrstuvwxyz; char *numstring=0123456789; char *strstring=abcdefghijklmnopqrstuvwxyz0123456789; char reservereser10; char

7、idshed4010,opshed4010; char token15,id15,sym15; char line80,tempp240; char ch,ch1,temp,tem; char tx10; char tn4,signt120,signt220,ju20; int cc,ii,k,num,kind,t,e4=0,e3=0,judge=1,row1=0; int startc,idsh=0,opsh=0,tt=1,nn=1,signwh,over=0,adds=0,whs=0,pp=0; int li=0; char filename15; FILE *fp; void getch

8、 if(li=0) if (cc=ii) cc=1; ii=0; if (row1=1) fseek(fp,-1,1); /*读行首字符将指针退回一格,若是整个文本的开头,则不需要*/ line0=fgetc(fp); row1=1; while(temp=fgetc(fp)!=n) & (temp!=EOF) linecc=temp; cc+; tempppp=temp; pp+; linecc= ; /*将缓冲带后加上一个空字符,以便行和行之间号区分 */ cc+; tempppp= ; pp+; while(temp=fgetc(fp)=n) & (temp!=EOF); /* 跳过空行

9、*/ linecc=0; tem=lineii; ii+; ch=tem; else ch=tempppp; pp+; void getnbc getch; while (ch= ) getch; if (ch=) do getch; while( ch=); getnbc; void retract ii-; void ret pp-; int jchar(char ch) /* 判断ch是不是字母 */ if(strchr(charstring,ch)=0) return 0; else return 1; int jnum(char ch) /* 判断ch是不是数字 */ if(strc

10、hr(numstring,ch)=0) return 0; else return 1; int jstr(char ch) /* 判断ch是不是字母或数字 */ if(strchr(strstring,ch)=0) return 0; else return 1; void advance getnbc; kind=0; if (jchar(ch)=1) k=0; do if(k15) tokenk=ch; k+; getch; while(jstr(ch)=1); if (li=0) retract; else ret; tokenk=0; /*截去token中的无用字符*/ strcpy

11、(id,token); for(t =0;t=20;t+) if(strcmp(reservet,id)=0) break; if ( t=20 ) kind=t ; else kind=21; strcpy(sym,id); else if (jnum(ch)=1) k=0; do if ( k15 ) tokenk=ch; k+; getch; while( jstr(ch)=1); if (li=0) retract; else ret; kind=22; tokenk=0; strcpy(sym,token); else if(ch=.) kind=26; k=0; do symk=

12、; k+; while(k!=15); sym0=ch; sym1=0; void error(int n) judge=0; /*出错退出,将judge0*/ switch(n) case 0:printf( Error(0):Expect : n); break; case 1:printf( Error(1):Expect = n); break; case 2:printf( Error(2):Syntax error n);break; case 3:printf( Error(3):Except Operater n);break; case 4:printf( Error(4):

13、Except ID or NUM n);break; case 5:printf( Error(5):Except ; n);break; case 6:printf( Error(6):Except n);break; case 7:printf( Error(7):Except = n );break; case 8:printf( Error(8):Except then n);break; case 9:printf( Error(9):Except Condition Expressionn );break; case 10:printf( Error(10):Except do )

14、;break; default: ; void e advance; if(strcmp(sym,+)=0)|(strcmp(sym,-)=0)|(strcmp(sym,*)=0)|(strcmp(sym,%)=0) printf(%s,sym); advance; if(kind=21) | (kind=22) /* kind为21,22分别表示的是标志符和数字 */ printf(%s,sym); e; else e4=1 ;error(4); /*出错退出,e4=1*/ void c advance; if(kind=21) | (kind=22) printf(%s,sym); e;

15、if(e4=1); /*e4的作用是判断程序从e中是不是出错退出*/ else if(strcmp(sym,)=0) printf(%s,sym); advance; if(kind=21) | (kind=22) printf(%s,sym); e; elseerror(4); else if(strcmp(sym,)=0) strcpy(ju,j); else strcpy(ju,j)=0) strcpy(ju,j); else strcpy(ju,j=); advance; idsh=0; opsh=0; advance; pushid; advance; if(strcmp(sym,+

16、)=0)|(strcmp(sym,-)=0)|(strcmp(sym,*)=0)|(strcmp(sym,%)=0) if (li=0) retract; else ret; ec; if (adds=1) gen(opshedopsh-1,idshedidsh-2,idshedidsh-1); adds=0; strcpy(signt2,tx); idsh=0; opsh=0; else strcpy(signt2,idshed0); printf(%d) %s, %s, %s, (%d) n,nn,ju,signt1,signt2,nn+1); nn+; advance; idsh=0;

17、opsh=0; if(kind=21) pushid; content; printf(%d) j, _, _, (%d)n,nn,reu); nn+; break; default: break; main strcpy(reserve8,if); strcpy(reserve19,while); strcpy(reserve4,do); strcpy(reserve16,then); printf(Please Input Source Program Filename:); scanf(%s,filename); fp=fopen(filename,r); cc=0;ii=0;ch=0; while (kind!=26) /*kind=26为读到了.,程序结束*/ startc=0; pp=0; statement; li=1; if(startc=1) pp=0; advance; pushid; content; li=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号