中间代码生成实验报告

上传人:hh****0 文档编号:231728726 上传时间:2023-09-07 格式:DOC 页数:16 大小:53KB
收藏 版权申诉 举报 下载
中间代码生成实验报告_第1页
第1页 / 共16页
中间代码生成实验报告_第2页
第2页 / 共16页
中间代码生成实验报告_第3页
第3页 / 共16页
资源描述:

《中间代码生成实验报告》由会员分享,可在线阅读,更多相关《中间代码生成实验报告(16页珍藏版)》请在装配图网上搜索。

1、 一 、 试验目的 通过在试验二的基础上,增加中间代码生成部分,使程序能够对试验二中的识别出的赋值语句,if语句和while语句进行语义分析,生成四元式中间代码。二 、 试验方法 试验程序由c语言完成,在Turboc 2.0环境中调试通过。 语义分析程序的基本做法是对文法中的每个产生式分别编写一个语义分析子程序,当程序语法部分进行推倒或规约时,就分别调用各自的语义分析程序。当语法分析结束时,语义分析也就结束了。 在本试验程序中,当语法分析部分识别出语法正确的句子时,就进入content函数(当语法分析识别出不正确的句子时,不进入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 s

3、l+78*7689*56+67 then while a-798+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)

4、+, T3, 4, T4 (6) :=, T4, -, f 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,

5、T13 (17) j, T11, T13, (18) (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;

7、 char reservereser10; char 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 filen

8、ame15; FILE *fp;void getch() 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)

9、=n) & (temp!=EOF); /* 跳过空行*/ 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 jn

10、um(char ch) /* 推断ch是不是数字 */if(strchr(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 r

11、et(); tokenk=0; /*截去token中的无用字符*/ strcpy(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,tok

12、en); else if(ch=.) kind=26; k=0; do symk= ; 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 O

13、perater n);break; case 4:printf( Error(4):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 );br

14、eak; case 10:printf( Error(10):Except do );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()

15、advance(); if(kind=21) | (kind=22) printf(%s,sym); e(); 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=); advan

16、ce(); idsh=0; opsh=0; advance(); pushid(); advance(); if(strcmp(sym,+)=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); prin

17、tf(%d) %s, %s, %s, (%d) n,nn,ju,signt1,signt2,nn+1); nn+; advance(); idsh=0; 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;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!