资源描述:
《编译原理实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理实验报告课程名称:编译原理课程设计考试形式:实验报告授课院(系):大连理工大学软件学院交作业日期:2012年7月20日共1页班级:学号:姓名:洋洋洋嘿嘿联系方式:电子邮件:手机号码:139********上机检查出勤实验报告(二)实验报告(三)总分标准分7010155100得分一、上机实验检查(总计70分):(1)分离解释和编译器(20分):将解释器从已有代码中分离出来,形成一个独立的解释器,对于中间代码文件,可以执行并输出相应的结果。(2)注释处理(10):增加对注释的支持,注释由(*和*)包含,不允许嵌套。(3)布尔数据处理(10分):增加对于布尔类型的支持,其产生式见《编译
2、原理实践教程》。(4)布尔表达式的短路处理(10分):在上面工作的基础上,对and和or采取短路计算。(5)for语句处理(20分): 参照C语言,增加对于for语句处理。二、完成情况(15分):1.修改后的PL/0词法(正规式)(a)注释的正规式为:leftpart—>(*,rightpart—>*),phrase—>(任意字符)*(b)布尔类型的正规式为:bool—>Boolean,int—>interger,colon—>:,true——>true,false——>false,band—>and,bor—>or,bnot—>not(c)For的正规式为:for—>for,lbra
3、ce—>{,rbrace—>},break—>break,and—>&&,or—>
4、
5、2.修改后的PL/0语法(产生式)(a)注释的产生式为:part—>leftpartphraserightpart;(b)布尔的产生式为:S—>ABcolonT;A—>var
6、constB—>idCC—>,idC
7、εT—>bool
8、intE—>TE’E’—>orTE’
9、εT—>FT’-9-T’—>andFT’
10、εF—>notF’F’—>(E)
11、id(c)FOR的产生式:S—>for(A;B;C)D;A—>statementE
12、εE—>,statementE
13、εB—>conditionF
14、εF—>Hcon
15、ditionF
16、εC—>statementG
17、εH—>and
18、orG—>,statementG
19、εD—>statement
20、ε各任务的实现伪代码或者主要思想(1)解释器分离:在这段代码中,由变异产生的目标代码存在code里面,然后由解释器进行执行。但是老师给的源代码中编译器和解释器是放在一起的。所以,我们就得分清哪部分是编译器,哪部分是解释器,最后把两者分开。所以,我新建了一个工程,只将base()函数和interrupt()函数拷贝进来,并对主函数进行修改,主要代码如下:if((infile=fopen(s,"r"))==NULL){printf("File%scan'tbeopene
21、d.",s);exit(1);}while(!feof(infile)){fread(&code[i++],size,1,infile);if(i>=CXMAX){printf("Thefile%sistoolarge,can'tbeexcuted",s);break;}printf("%5d%st%dt%d",i,mnemonic[code[i-1].f],code[i-1].l,code[i-1].a);}interpret();(2)注释处理:在getsym()函数中,当时别处‘(’时,紧接着读取下一个字符,判断是否为‘*’号,如果不是则把‘sym’置为做括号标记,不再
22、处理,如果是的话则表明是注释的开始,然后继续取字符,直到遇到’*’,并且去下一个判断是否是’)‘,如果是的话,则再次调用getsym(),不是的就继续。关键代码如下:while((!feof(infile))//added&modifiedbyalex01-02-09&&((ch=getc(infile))!='')){////////////////////////////注释处理if('('==ch){ch=getc(infile);if('*'==ch)//是注释{while(1){ch=getc(infile);-9-if('*'==ch){ch=getc(infile);i
23、f(')'==ch)//注释结束{ch=getc(infile);break;}else{fseek(infile,-1,SEEK_CUR);}}}}else//不是注释回退指针{fseek(infile,-1,SEEK_CUR);ch='(';}}fprintf(outfile,"%c",ch);printf("%c",ch);line[++ll]=ch;}(3)布尔类型处理增加一个新的数据类型需要改变很多地方:A.改变NRW的值