版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计课程名称的编译原理标题名称PL/0编译器的扩展学生学院计算机学院专业级计算机科学和技术12(4)取得学位学生名柏石先导师李杨程序功能完成的情况下测试用例的完整性学生必须精通程序。报告形式是否符合要求。报告的内容是否准确、全面2014年12月28日一、实验的目的和要求基本内容(成绩范围:“中”、“合格”或“不合格”)(1)扩展代入运算:=和/=(2)扩展文件(Pascal的FOR文件) :FOR变量:=表达式STEP表达式UNTIL表达式Do语句选择内容(成绩评定范围扩大到“优”和“良”)(1)追加类型:文字类型实数型。(2)追加评论的评论由/*和*/构成(3)扩展函数:有返回值和返回值
2、有参数函数。(4)增加一维数组类型(可以增加命令)。(五)其他典型的语言设施。二、实验环境和工具1、源语言: PL/0语言,PL/0语言是PASCAL语言的子集,其编译器是编译解析执行系统,扩展名为. PL0;2、目标语言:生成文件后缀为*.COD的目标代码3 .实现平台: Borland C Builder 64 .执行平台: Windows 8.1三、设计概要1 .结构设计说明(1)PL/0编译系统的框架外出错了处理科信数数儿手表格管子理科信数数儿PL/0源程序目标代码生成程序目标代码生成程序目标代码生成程序目标代码生成程序目标代码生成程序源语言:源语言是用c语言写成的PL/0编译器PL0
3、语言(可视为Pascal语言的子集)目标语言:虚拟堆栈计算语言,即类PCODE指令代码。指令的形式如下所示f.fl甲组联赛这里,f是功能代码,l是阶层差,a的意思根据命令而不同。具体的命令菜单:PR0a把常数值取在堆栈顶部,把a作为常数值洛德la取变量值在堆栈的最上面,把a作为偏置,把l作为阶差STO l a将堆栈顶部的内容发送到某个变量单元,a是偏移量,l是台阶.卡鲁a公司调用过程,a是过程地址,l是层次差PR0a为在执行堆栈中调用的进程打开a设备的数据区PS0K无条件地跳至a地址JPC 0 a如果堆栈顶部的布尔值不为真,则跳到a地址,否则按顺序执行条件跳转OPR 0 0过程调用结束后,返回
4、到调用点并结束堆栈。OPR 0 1反转堆栈顶部元素OPR 0 2在子堆栈的顶部加上堆栈的顶部,减去两个堆栈元素,然后将结果值放入堆栈中OPR 0 3从子堆栈的顶部减去堆栈的顶部,减去两个堆栈元素,然后将结果值放入堆栈中OPR 0 4将堆栈的顶部乘以子堆栈的顶部,返回两个堆栈元素,然后将结果值放入堆栈中OPR 0 5将子堆栈的顶部除以堆栈的顶部,返回两个堆栈元素,并将结果值放入堆栈中OPR 0 6对于堆栈顶部元素的奇偶校验判定,结果值位于堆栈顶部OPR 0 7OPR 0 8子堆栈的顶部和顶部是否相等,减去两个堆栈元素,将结果值放在堆栈中OPR 0 9子堆栈的顶部和顶部是否不同,减去两个堆栈元素,
5、将结果值放入堆栈中OPR 0 10返回两个堆栈元素,表示子堆栈的顶部是否小于堆栈的顶部,然后将结果值放入堆栈中OPR 0 11子堆栈的顶部是否在堆栈的顶部以上会返回两个堆栈元素,并将结果值放在堆栈中OPR 0 12子堆栈的顶部是否大于堆栈的顶部会返回两个堆栈元素,并将结果值放在堆栈中OPR 0 13子堆栈的顶部是否小于或等于堆栈的顶部会返回两个堆栈元素,并将结果值放在堆栈中OPR 0 14将堆栈顶部值输出到画面上OPR 0 15画面输出换行OPR 0 16从命令行读取输入,并将其放在堆栈的顶部四、设计分析(1)扩展代入运算:=和/=必须添加两个运算符*=和/=,并替换为下表中定义的symmet
6、rix运算符*=/=symmetrix显示TIMESBECOMESSLASHBECOMES*=和/=的语法描述图:(2)扩展文(Pascal的FOR文)因为Pascal的FOR语句是如下记述的。FOR变量:=表达式STEP表达式UNTIL表达式DO语句添加FOR、STEP、UNTIL和DOFOR语句的语法说明图如下五、程序设计1 )要增加所需的保留字和运算符,以实现*=和/=,以及FOR语句,必须增加TIMESBECOMES、SLASHBECOMES、FOR、STEP、UNTIL和DO。注:因为有必要统合上课设定和前一个实验的内容,所以留下在上课实验中追加的预约词和运算符,不说明之前追加的内容
7、。具体实施的语句如下:typedef enum NUL,IDENT,NUMBER,PLUS,具有,TIMES,SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQLPAREN、RPAREN、COMMA、SEMICOLON、周期BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,写sym,读sym,DOSYM,呼叫sym,CONSTSYM,VARSYM,PROCSYM,prosym,ELSESYM,FORSYM,STEPSYM,UNTILSYM,RETURNSYM,TIMESBECOMES,SLASHBECOMES,andsymmet
8、ry,orsymmetry,NOTSYM SYMBOL;在此,有必要增加保留词的数量,如何命名,并将新追加的保留词追加到对应的保留词的集合中。 具体实施的语句如下:char *SYMOUT=NUL”,“IDENT”,“具有NUMBER”,“PLUS”,“时间”,“SLASH”、“ODDSYM”、“EQL”、“NEQ”、“LSS”、“LEQ”、“GTR”、“GEQ”,“LPAREN”、“RPAREN”、“COMMA”、“SEMICOLON”、“周期”,“BECOMES”、“BEGINSYM”、“结束sym”、“IFSYM”、“THENSYM”,“WHILESYM”、“写入sym”、“读sym”、
9、“DOSYM”、“呼叫sym”,“CONSTSYM”、“VARSYM”、“PROCSYM”、“prosym”、“ELSESYM”,“FORSYM”、“STEPSYM”、“UNTILSYM”、“RETURNSYM”、“TIMESBECOMES”,“SLASHBECOMES”,“和sym”,“非sym”2 )按字母的升序添加新添加的保留词,运算符参照现有的运算符进行添加。 请注意符号和symmetrix的对应。 具体实施的语句如下:特别注意:在这里,必须考虑PLO编译器是使用存折检索算法进行操作的。 如果没有使用默认的升序规则插入新添加的保留字,编译器可能无法识别某些保留字。strcpy(KWOR
10、D 1, BEGIN ); strcpy(KWORD 2,呼叫 );strcpy(KWORD 3,const ); strcpy(KWORD 4,do );strcpy(KWORD 5, else );strcpy(KWORD 6,结束 );strcpy(KWORD 7, for );strcpy(KWORD 8, if );strcpy(KWORD 9,PS ); strcpy(KWORD 10,程序 );strcpy(KWORD 11, PROGRAM ); strcpy(KWORD12, read );strcpy(KWORD13, RETURN );strcpy(KWORD14, st
11、ep );strcpy(KWORD15, then );strcpy(KWORD16, until );strcpy(KWORD17, var );strcpy(KWORD18, WHILE ); strcpy(KWORD19,write );WSYM 1=BEGINSYM; wsym 2=呼叫sym;WSYM 3=CONSTSYM; WSYM 4=DOSYM;WSYM 5=ELSESYM;wsym 6=结束sym;wsym7=forsymmetry;WSYM 8=IFSYM;WSYM 9=ODDSYM; WSYM 10=PROCSYM;WSYM 11=PROGSYM; wsym 12 =读s
12、ym;wsym 13 =返回sym;WSYM14=STEPSYM;WSYM15=THENSYM;WSYM16=UNTILSYM;WSYM17=VARSYM;WSYM18=WHILESYM; wsym 19 =写入sym;SSYM =PLUS; 具有ssym-=SSYM*=TIMES; SSYM/=SLASH;SSYM(=LPAREN; SSYM)=RPAREN;SSYM=EQL; SSYM,=COMMA;ssym .=周期;SSYM; =SEMICOLON;ssym=andsymmetry;ssym|=orsymmetry;SSYM! =NOTSYM;3 )应该特别注意的地方是,这很容易被忽略
13、,保留词和运算符的追加完成后,PLO编译器必须对保留词的个数已经修改了单词总数的定义。保留词总数例如,如果不添加任何保留字,则在Unit1.CPP中定义了const norw=14/* # of reserved words * /实验中新增加了五个保留词,这里应该更改如下const NORW=19; /* # OF RESERVED WORDS */单词总数与保留字的总数一样,在添加保留字和运算符之后,为了修改单词,例如,原始单词的总数为33,原始编译器中没有定义常数,所以必须修改所有的“i33”处。 实验中新增加了10个单词,应该变更为“i43”。下面是一个代码示例SYMSET SymSe
14、tUnion(SYMSET S1,SYMSET S2) symsetss=(sym set ) malloc (sizeof (int ) * 43 )for (int i=0; i43; PS )PS (UR| UR UR ) s I =1;else Si=0;返回s;以下特别是在这个地方,如果不将数量变更为43的话,也会发生异常的信息。declbegsys=(int * ) malloc (sizeof (int ) * 43 )statbegsys=(int * ) malloc (sizeof (int ) * 43 )facbegsys=(int * ) malloc (sizeof (int ) * 43 )for(int j=0; j43; 开j )DECLBEGSYSj=0; STATBEGSYSj=0; FACBEGSYSj=0;以下体验:这里的细节发生了很多意想不到的问题。 在很多情况下,只有通过调试才被发现。 部分地方被变更了。 实际上,可以考虑设定全局变量并统一地进行修改,但是我认为向编译器添加全局变量不是一个好方法,会发生可能的篡改,并不直观。 只是根据原则进行了修改。4 )向GetSym ()函数添加适当的运算符分析判
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理人文关怀与患者心理支持
- 动脉粥样硬化早期症状识别
- 医院环境清洁与消毒
- 部编版二年级语文下册《中国美食 第1课时》
- 腹部按摩健康指南
- 《玩出新气象》教学课件-2025-2026学年苏少版(新教材)小学美术二年级下册
- 激发科学兴趣的良方优 秀科普作家会员介绍
- 联想市场推广团队工作经历
- 零售业人力资源总监选拔策略
- 理赔专员与客户的沟通艺术与技巧
- 和父亲断绝联系协议书范本
- TB-10414-2018-铁路路基工程施工质量验收标准
- 中建五局有限空间作业方案编制指南(2022版)
- 中职高考《农业经营与管理》考试题库大全-中(多选题)
- 苏教版小学科学五年级下册单元测试题(含答案)
- 全国中学生物理竞赛公式
- 诊断学课件:病历书写
- 鼻咽癌患者放疗护理课件整理
- 上市公司内部控制手册模板
- 2021年高一下物理第六章《圆周运动》测试卷及答案解析
- 高考作文复习:议论文写作之驳论文段指导
评论
0/150
提交评论