0934130118张晓楠实验报告编译原理.docx
- 文档编号:2374417
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:79
- 大小:63.97KB
0934130118张晓楠实验报告编译原理.docx
《0934130118张晓楠实验报告编译原理.docx》由会员分享,可在线阅读,更多相关《0934130118张晓楠实验报告编译原理.docx(79页珍藏版)》请在冰豆网上搜索。
0934130118张晓楠实验报告编译原理
麻省理工
实验报告
课程名称:
编译原理
院系:
信息工程学院
专业班级:
软工0901B
学号:
0834130112
学生姓名:
张小楠
指导教师:
许晓辉
开课时间:
2011至2012学年第2学期
一、学生撰写要求
按照实验课程培养方案的要求,每门实验课程中的每一个实验项目完成后,每位参加实验的学生均须在实验教师规定的时间内独立完成一份实验报告,不得抄袭,不得缺交。
学生撰写实验报告时应严格按照本实验报告规定的内容和要求填写。
字迹工整,文字简练,数据齐全,图表规范,计算正确,分析充分、具体、定量。
二、教师评阅与装订要求
1.实验报告批改要深入细致,批改过程中要发现和纠正学生实验报告中的问题,给出评语和实验报告成绩,签名并注明批改日期。
实验报告批改完成后,应采用适当的形式将学生实验报告中存在的问题及时反馈给学生。
2.实验报告成绩用百分制评定,并给出成绩评定的依据或评分标准(附于实验报告成绩登记表后)。
对迟交实验报告的学生要酌情扣分,对缺交和抄袭实验报告的学生应及时批评教育,并对该次实验报告的分数以零分处理。
对单独设课的实验课程,如学生抄袭或缺交实验报告达该课程全学期实验报告总次数三分之一以上,不得同意其参加本课程的考核。
3.各实验项目的实验报告成绩登记在实验报告成绩登记表中。
本学期实验项目全部完成后,给定实验报告综合成绩。
4.独立设课的实验课程,实验报告综合成绩应按课程教学大纲规定比例(一般为10-15%)计入实验课总评成绩;实验总评成绩原则上应包括考勤、实验报告、考核(操作、理论)等多方面成绩;
5.非独立设课的实验课程,实验报告综合按教学大纲规定计入相关理论课程的总评成绩。
6.实验教师每学期负责对拟存档的学生实验报告按课程、学生收齐并装订,按如下顺序装订成册:
实验报告封面、实验报告成绩登记表、实验报告成绩评定依据、实验报告(按教学进度表规定的实验项目顺序排序)。
装订时统一靠左侧按“两钉三等分”原则装订。
7.根据课程性质,实验报告可提交电子版,但需要有教师的批改记录,并将电子版汇总后刻录在一张光盘上,并加上封面、实验报告成绩登记表、实验报告成绩评定依据。
编译原理课程综合性、设计性实验报告1
实验名称
熟悉pl/0编译程序
实验时间
2012年2月27日
学生姓名
张晓楠
实验地点
617
同组人员
无
专业班级
软工0901B
一、实验方案
1、实验目的:
熟悉pl/0编译程序
2、实验主要仪器设备及材料:
硬件:
微型计算机
软件:
MircrosoftVisualC++6.0
3、理论依据:
语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。
语法分析主要由分程序分析过程(block)、常量定义分析过程(constdeclaration)、变量定义分析过程(vardeclaration)、语句分析过程(statement)、表达式处理过程(expression)、项处理过程(term)、因子处理过程(factor)和条件处理过程(condition)构成。
这些过程在结构上构成一个嵌套的层次结构。
除此之外,还有出错报告过程(error)、代码生成过程(gen)、测试单词合法性及出错恢复过程(test)、登录名字表过程(enter)、查询名字表函数(position)以及列出类PCODE代码过程(listcode)作过语法分析的辅助过程。
由PL/0的语法图可知:
一个完整的PL/0程序是由分程序和句号构成的。
因此,本编译程序在运行的时候,通过主程序中调用分程序处理过程block来分析分程序部分(分程序分析过程中还可能会递归调用block过程),然后,判断最后读入的符号是否为句号。
如果是句号且分程序分析中未出错,则是一个合法的PL/0程序,可以运行生成的代码,否则就说明源PL/0程序是不合法的,输出出错提示即可。
4、实验方法和步骤:
1、结合教材第二章内容,对给定pl/0编译程序进行理解分析,并对该程序添加注释。
2、提交添加注释后的pl/0编译程序。
5、参考文献:
张素琴.编译原理.北京:
清华大学出版社,2005.2
指导教师对实验方案的意见:
指导教师签字:
2012年2月9日
二、实验过程与结果
1、实验实施过程:
结合课本调试程序。
2、实验现象、实验数据记录:
程序在TurboPascal7.0上编译运行通过。
************************************************************************************
programpl0(fa,fa1,fa2);(*PL/0编译程序与代码生成解释运行程序*)
(*PL/0compilerwithcodegeneration*)
label99;(*声明出错跳转标记*)
(*在TurboPascal7.0中已不允许跨过程的GOTO转移,因此后面的GOTO语句均被我去除了,因此这里的label也没有意义了*)
const(*常量定义*)
norw=13;(*ofreservedwords*)(*保留字的个数*)
txmax=100;(*lengthofidentifiertable*)(*标识符表的长度(容量)*)
nmax=14;(*maxnumberofdigitsinnumbers*)(*数字允许的最长位数*)
al=10;(*lengthofidentifiers*)(*标识符最长长度*)
amax=2047;(*maximumaddress*)(*寻址空间*)
levmax=3;(*maxdepthofblocknesting*)(*最大允许的块嵌套层数*)
cxmax=200;(*sizeofcodearray*)(*类PCODE目标代码数组长度(可容纳代码行数)*)
type(*类型定义*)
symbol=(nul,ident,number,plus,minus,times,slash,oddsym,
eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,
semicolon,period,becomes,beginsym,endsym,ifsym,
thensym,whilesym,writesym,readsym,dosym,callsym,
constsym,varsym,procsym);(*symobl类型标识了不同类型的词汇*)
alfa=packedarray[1..al]ofchar;(*alfa类型用于标识符*)
object1=(constant,variable,procedur);(*object1为三种标识符的类型*)
(*原程序在此使用object作为类型名称,在支持面向对象的TurboPascal7.0中编译不能通过*)
(*wirthusedtheword"procedure"there,whickwon'twork!
*)
(*上面一行是课本上的程序清单中的注释,说本程序的原作者Wirth在这里用了procedure这个词作为标识符类型,是不可以的。
事实上Wirth原本在这里用的词是prozedure,是可以的。
*)
symset=setofsymbol;(*symset是symbol类型的一个集合类型,可用于存放一组symbol*)
fct=(lit,opr,lod,sto,cal,int,jmp,jpc);(*fct类型分别标识类PCODE的各条指令*)
instruction=packedrecord
f:
fct;(*functioncode*)
l:
0..levmax;(*level*)
a:
0..amax;(*displacementaddr*)
end;(*类PCODE指令类型,包含三个字段:
指令f、层差l和另一个操作数a*)
(*
lit0,aloadconstanta
opr0,aexecuteopra
lodl,aloadvariablel,a
stol,astorevariablel,a
call,acallprocedureaatlevell
int0,aincrementt-registerbya
jmp0,ajumptoa
jpc0,ajumpconditionaltoa
*)
var(*全局变量定义*)
fa:
text;(*文本文件fa用于列出源程序*)
fa1,fa2:
text;(*文本文件fa1用于列出类PCODE代码、fa2用于记录解释执行类PCODE代码的过程*)
listswitch:
boolean;(*truesetlistobjectcode*)(*如果本变量置true,程序编译后将为列出类PCODE代码,否则不列出类PCODE代码*)
ch:
char;(*lastcharread*)(*主要用于词法分析器,存放最近一次从文件中读出的字符*)
sym:
symbol;(*lastsymbolread*)(*词法分析器输出结果之用,存放最近一次识别出来的token的类型*)
id:
alfa;(*lastidentifierread*)(*词法分析器输出结果之用,存放最近一次识别出来的标识符的名字*)
num:
integer;(*lastnumberread*)(*词法分析器输出结果之用,存放最近一次识别出来的数字的值*)
cc:
integer;(*charactercount*)(*行缓冲区指针*)
ll:
integer;(*linelength*)(*行缓冲区长度*)
kk:
integer;(*引入此变量是出于程序性能考虑,见getsym过程注释*)
cx:
integer;(*codeallocationindex*)(*代码分配指针,代码生成模块总在cx所指位置生成新的代码*)
line:
array[1..81]ofchar;(*行缓冲区,用于从文件读出一行,供词法分析获取单词时之用*)
a:
alfa;(*词法分析器中用于临时存放正在分析的词*)
code:
array[0..cxmax]ofinstruction;(*生成的类PCODE代码表,存放编译得到的类PCODE代码*)
word:
array[1..norw]ofalfa;(*保留字表*)
wsym:
array[1..norw]ofsymbol;(*保留字表中每一个保留字对应的symbol类型*)
ssym:
array[''..'^']ofsymbol;(*一些符号对应的symbol类型表*)
(*w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 0934130118 张晓楠 实验 报告 编译 原理