中间代码生成实验报告

上传人:夏** 文档编号:487805218 上传时间:2023-09-17 格式:DOCX 页数:20 大小:53.90KB
返回 下载 相关 举报
中间代码生成实验报告_第1页
第1页 / 共20页
中间代码生成实验报告_第2页
第2页 / 共20页
中间代码生成实验报告_第3页
第3页 / 共20页
中间代码生成实验报告_第4页
第4页 / 共20页
中间代码生成实验报告_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《中间代码生成实验报告》由会员分享,可在线阅读,更多相关《中间代码生成实验报告(20页珍藏版)》请在金锄头文库上搜索。

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

2、句子的类型进 行分类,进入不同的语义处理部分。对于赋值语句,关键是产生正确的处理算术表达式E的四元式。 程序中的ec函数的功能就是产生算术表达式的四元式,在ec函 数中使用了两个栈idshed, opshed,分别是算术表达式的数据栈 和符号栈。每次提取一个数字和一个算符,然后将算符与与栈顶算 符进行优先级比较,优先级高则将单前数字和算符进栈,低或者相 等的话则将当前栈顶元素进行合并,产生四元式。直至整个算术表 达式结束。其中还有一些细节问题,具体的做法可以参看程序。对于实验给定的 if 语句的文法格式,条件判断式 C 只中可能 是或者=两种关系,不可能是布尔表达式,这样程序就简单的多 了。通

3、过ec函数可以产生条件判断式C中的E的四元式,然后只要加 上转向四元式就可以了。本实验程序中只给出真出口的转向四元 式,没有给出假出口的转向四元式,这在实际中是不可以的,但在 本实验中,实际上是对每条独立的语句进行语法分析,给出假出口 转向四元式实际上意义不大,而且假出口转向语句的转移目标必须 要到整个语句分析结束以后才可以知道,这样就要建立栈,然后回 填,这样会使程序复杂很多,所以没有加上假出口转向四元式。对于while语句,具体的做法和if语句差不多,所不同的是当 while 语句结束时,要多出一条无条件转向四元式,重新转到条件 判断式 C 的第一条四元式。当要产生无条件转向四元式时,它的

4、转 向目标 C 的第一条四元式已经产生了,所以具体的做起来是不太困 难的。只要记下当前while中的C的第一条四元式的位置,填上就 可以了。整个程序的结束是当读入“ . ”时,程序就中止。 程序中还有很多细节问题,具体的可以后面的附录:程序的完 整代码。、 测试程序ff:=6+6*6-;if sl89+56*67then f:=7*7+4;ff:=6+6*6-6%4+8;if sl+78*7689*56+67then while a-798+45*45 do f:=7*7+4;、 运行结果首先对测试程序进行语法分析,识别出正确的句子,当识别 出正确的句子时,就对当前句子进行语义分析,而语法不正

5、确的 句子不进行语义分析。ff:=6+6*6- Error(4):Except ID or NUMsuccess; Error(2):Syntax errorif sl89+56*67 then f:=7*7+4;(1) *, 56, 67, T1 (2) +, 89, T1, T2 (3) j, sl, T2, (4) (4) *, 7, 7, T3 (5) +, 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,

6、 T8 (11) +, T8, 8, T9 while a-798+45*45 do f:=7*7+4;(12) :=, T9, -, ff if sl+78*7689*56+67 then success(13) *, 78, 76, T10 (14) +, sl,T10, T11 (15) *, 89, 56, T12 (16) +,T12, 67, 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,

7、 T17 (23) +,T17, 4, T18 (24) :=, T18, -, f (25) j, _, _, (18) . Error(2):Syntax error 五 、 实验小结终于完成了编译原理的三次实验,这几次实验使我们更彻底地巩 固了编译原理。从詷法分析到语法分析直到这次的中间代码都是看似简 单的基础知识,却花了不少时间对课本多次反复研究、请教学习,进行 深层次地探讨才找出编程时出现的种种问题。还有很多程序方面很细节 的问题,很容易被突略,却往往又是关键。总地来说,虽然实验做得很辛苦,但真的可以从实验当中学习到很 多,认识到很多。并对编译理解也透彻了许多,比较清晰地掌握了编译

8、程序的原理和方法。附录:#include#include#include#define reser 20char *charstring=abcdefghijklmnopqrstuvwxyz;char *numstring=0123456789;char *strstring=abcdefghijklmnopqrstuvwxyz0123456789;char reservereser10;char idshed4010,opshed4010;char token15,id15,sym15;char line80,tempp240;char ch,ch1,temp,tem;char tx10;c

9、har 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()if(li=0) if (cc=ii)cc=1; ii=0;if (row1=1) fseek(fp,-1,1); /*读行首字符将指针退回一格,若是整个文本的开头 则不需要*/line0=fgetc(fp);row

10、1=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); /* 跳过空行*/ linecc=0;tem=lineii;ii+;ch=tem;elsech=tempppp;pp+;void getnbc()getch();while (ch= )getch();if (ch=)dogetch();while( ch

11、=); getnbc();void retract()ii-;void ret()pp-;int jchor(chor ch)/* 判断 ch 是不是字母 */if(strchr(charstring,ch)=0) return 0;else return 1;/*判断ch是不是数字*/*判断ch是不是字母或数字*/int jnum(char ch)if(strchr(numstring,ch)=0) return 0;else return 1;int jstr(char ch) if(strchr(strstring,ch)=0) return 0;else return 1;void a

12、dvance()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(id,token);for(t =0;tv=20;t+) if(strcmp(reservet,id)=0) break;if ( tv=20 ) kind=t ;else kind=21;strcpy(sym,id);elseif (jnum(ch)=1)k=0;doif

13、( k15 ) tokenk=ch; k+; getch();while( jstr(ch)=1);if (li=0)retract();else ret();kind=22;tokenk=0;strcpy(sym,token);elseif(ch=.) kind=26;k=0;dosymk= ; k+; while(k!=15);sym0=ch; sym1=0;void error(int n)judge=O;/*出错退出,将 judge = O*/switch(n)case O:printf( Error(O):Expect : n); break; case 1:printf( Erro

14、r(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):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;ca

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号