2015广工编译原理课程设计报告(文档最后含源码下载地址)

合集下载

2015广工编译原理课程设计报告(文档最后含源码下载地址)

2015广工编译原理课程设计报告(文档最后含源码下载地址)

课程设计课程名称___编译原理__________题目名称___PL/0编译器的扩充 __ 学生学院___计算机学院_________专业班级_计算机科学与技术13(9)学号学生姓名指导教师___林志毅________________ 2016 年1 月2 日一、 已完成的内容:(1) 扩充赋值运算:*= 和 /=(2) 扩充语句(Pascal 的FOR 语句)FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(3) 增加类型:①字符类型;②实数类型。

(4) 增加注释; 多行注释由/*和*/包含,单行注释为//二、 实验环境与工具(1)计算机及操作系统:PC 机,Windows7(2)程序设计语言:C++(3)使用软件Borland C++ Builder 6.0(4)教学型编译程序:PL/0三、 具体实现:1. 扩充赋值运算:*= 和 /=(1) 语法树(2) 修改GetSym()方法(写出修改的代码)else if(CH=='*') {GetCh();if(CH=='=') { SYM=TIMESBECOMES; GetCh(); }else SYM=TIMES;} else if(CH=='/') {GetCh();if(CH=='=') { SYM=SLASHBECOMES; GetCh(); }(3) 修改STATEMENT ()方法(写出修改的代码)case IDENT:i=POSITION(ID,TX); if (i==0) Error(11);else if (TABLE[i].KIND==VARIABLE || TABLE[i].KIND==FLOATTYPE) { /*ASSIGNMENT TO NON-VARIABLE*/GetSym();if (SYM==BECOMES|| SYM==TIMESBECOMES || SYM==SLASHBECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES) {RELOP=SYM;if(SYM!=BECOMES) { //若为除等于(或其他类似符号)则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}GetSym();} else Error(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES) {GEN(OPR,0,4);} else if(RELOP==SLASHBECOMES) {GEN(OPR,0,5);} else if(RELOP==PLUSBECOMES) {GEN(OPR,0,2);} else if(RELOP==MINUSBECOMES) {GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(4)运行测试(测试的PL0源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAM EX01;VAR A,B,C,D;BEGINA:=16;A/=2;WRITE(A); //结果为8B:=4;B*=2;WRITE(B); //结果为8C:=6;C+=2;WRITE(C); //结果为8D:=10;D-=2;WRITE(D); //结果为8END.(5)运行结果:(6)出现的问题及解决开始时在实现/=和*=操作时,*=的实现很顺利,而/=却一直没有得到理想的结果,通过与同学的讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈中的位置相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。

广东工业大学编译原理课设

广东工业大学编译原理课设

课程设计课程名称编译原理题目名称对PL/0的修改与扩充学生学院计算机学院专业班级学号学生姓名指导教师2014 年 1 月 3 日一.课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

二.课程设计要求(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal 的FOR 语句):FOR <变量>:=<表达式>STEP<表达式> UNTIL<表达式>Do<语句>三.课程设计环境与工具1. 程序运行环境:(1)运行平台:Windows XP(2)实现工具:Borland C++ Building 6.0(3)教学型编译程序:PL/0 2.源程序:PL/0 源代码四.结构设计说明PL/0编译程序的结构图Pl0 源 程 序词法分析程序语法分析程序代码生产程序目 标 程 序表 格 管 理程序出错 处 理 程 序各功能模块描述过程或函数名简要功能说明pl0 主程序error 出错处理,打印出错位置和错误编码getsym 词法分析,读取一个单词getch 漏掉空格,读取一个字符gen 生成目标代码,并送入目标程序区test 测试当前单词符号是否合法block 分程序分析处理过程enter 登录名字表position(函数) 查找标识符在名字表中的位置constdeclaration 常量定义处理vardeclaration 变量说明处理listode 列出目标代码清单statement 语句处理expression 表达式处理term 项处理factor 因子处理condition 条件处理interpret 对目标代码的解释执行程序base(函数) 通过静态链求出数据区的基地址PL/0编译程序的总体流程图五、主要成分描述 1、符号表全程量一维数组。

《编译原理》设计方案报告

《编译原理》设计方案报告

《编译原理》课程设计报告设计题目:pl0编译器设计一、PL0程序的文法及,指令及属性翻译简化c语言文法定义(LL(1)文法)C程序::=void main(){函数体}函数体::=变量定义部分语句列变量定义部分::=变量定义变量定义部分| ɛ变量定义::=int 变量表变量表::=标识符|标识符,变量表语句列::=语句语句列| ɛ语句::=条件语句| 循环语句| 读语句| 写语句| 复合语句| 表达式语句| 空语句条件语句::=if(表达式)语句循环语句::=while(表达式)语句读语句::=read(变量表);写语句::=write(表达式表);复合语句::={语句列};表达式语句::=表达式;空语句::=;表达式定义(算符优先文法)表达式::=变量=表达式| 变量+=表达式| 变量-=表达式| 变量*=表达式| 变量/=表达式| 变量%=表达式| 表达式1表达式1::=表达式1 || 表达式2 | 表达式2表达式2::=表达式2&&表达式3 | 表达式3表达式3::=表达式3==表达式4 | 表达式3!=表达式4 | 表达式3>=表达式4 | 表达式3>表达式4 | 表达式3<=表达式4 | 表达式3<表达式4 | 表达式4表达式4::=表达式4+表达式5 | 表达式4-表达式5 | 表达式5表达式5::=表达式5*表达式6 | 表达式5/表达式6 |表达式5/表达式6 |表达式6表达式6::=!表达式7表达式7::=(表达式) | 变量| 常量PL0文法定义《程序》::=《分程序》.《分程序》::=《常量定义》;《常后分程序》|《常后分程序》《常后分程序》::=《变量定义》;《变后分程序》|《变后分程序》《变后分程序》::=《过程定义》;《变后分程序》|《语句》《常量定义》::=const 《常量定义表》《常量定义表》::=id = number | id = number,《常量定义表》《变量定义》::= var 《变量表》《变量表》::=id | id,《变量表》《过程定义》::=procedure id ;《分程序》《语句》::=《赋值语句》|《条件语句》|《循环语句》|《读语句》|《写语名》|《复合语句》| 《过程调用语句》|ε《赋值语句》::=id := 《表达式》《读语句》::=read(《变量表》)《写语句》::=write(《表达式表》)《表达式表》::=《表达式》| 《表达式》,《表达式表》《条件语句》::=if 《条件表达式》then 《语句》《循环语句》::=while 《条件表达式》do 《语句》《复合语句》::=begin 《语句列》end《过程调用语句》::=call id《参量表》::=《有参表》|ε《有参表》::=《表达式》,《有参表》|《表达式》《表达式》::=+《表达式1》|-《表达式1》|《表达式1》《表达式1》::=《表达式1》+《表达式2》|《表达式1》-《表达式2》|《表达式2》《表达式2》::=《表达式2》*《表达式3》|《表达式2》/《表达式3》| 《表达式2》mod 《表达式3》|《表达式3》《表达式3》::=id | number | (《表达式》)《条件表达式》::=《条件表达式》or 《条件表达式1》|《条件表达式1》《条件表达式1》::=《条件表达式1》and 《条件表达式2》| 《条件表达式2》《条件表达式2》::=not 《条件表达式3》|《条件表达式3》《条件表达式3》::=(《条件表达式》)|《关系表达式》《关系表达式》::=《表达式》>《表达式》《关系表达式》::=《表达式》>=《表达式》《关系表达式》::=《表达式》<《表达式》《关系表达式》::=《表达式》<=《表达式》《关系表达式》::=《表达式》=《表达式》《关系表达式》::=《表达式》#《表达式》PL0栈式机指令指令格式:指令码(f) 所在层数差(l),操作数(a)PL0栈式机指令:LIT:将常数a取到栈顶LOD:将位于(当前层-l)层处的变量a取到栈顶STO:将栈顶处值存储到指定位置,l,a同上CALL 调用当前-l层处的过程aINT:为调用过程在栈中开辟数据区,a为单元个数JMP:无条件转移指令,a目标地址JPC:条件转移指令,栈顶值的布尔值为非真时转移到a处,否则执行下面语句OPR:关系运算或算术运算PL0属性翻译MCONST(const:常量定义开始), V AR(var:变量定义开始), PROCEDURE(procedure:过程定义开始),CALL(call:过程调用语句),BEGIN(begon:复合语句开始),END(end:复合语句结束),IF(if:条件语句开始),THEN(then:条件结束),WHILE(while:循环语句开始), DO(do:循环条件结束), READ(read:读语句),WRITE(write:输出语句), ODD(odd:判奇运算),//分隔符、运算符号DOT(点:.),COMMA(逗号:,), SEMICOLON(分号:;), LPAREN(左括号:(), RPAREN(右括号:)), ASSIGNOP(赋值::=), PLUSOP(加法运算符号:+), MINUSOP(减法运算符:-), MULTOP(乘法运算符:*), DIVOP(除法运算符:/),GT(大于:>),GE(大于等于:>=),LT(小于:<),LE(小于等于:<=),EQ(等于:=),NE(不等:#),ENDF(输入结束符),//分析过程中需要的非终结符号SERVERKEY(保留字), FACTOR(因子),ROP(关系运算), CONSTANT(常量部份定义), V ARIABLE(变量部份定义), IDENT(自定义标识符), NUMBER(常数)二、符号表的结构,组织,填写及查找1、符号表结构const char *pName; //符号名称int kind; //符号类别,由上面单词分类确定int val; //符号表中的位置值int level; //符号的层数int parent; //符号的作用域int size; //过程长度char strBuff[MAXLENSTR]; //符号堆2、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。

广工编译原理课程设计

广工编译原理课程设计

广工编译原理课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器各阶段的工作原理及相互关系。

2. 学会使用一种编程语言(如C语言)进行词法分析、语法分析、语义分析及中间代码生成。

3. 掌握基本的代码优化和目标代码生成方法。

技能目标:1. 能够运用所学编译原理知识,独立完成一个简单的程序设计语言的编译器设计。

2. 培养学生运用形式语言和自动机理论解决实际问题的能力。

3. 提高学生的编程实践能力,培养良好的编程习惯。

情感态度价值观目标:1. 培养学生对编译原理课程的兴趣,激发学习热情,形成积极的学习态度。

2. 培养学生的团队协作意识,学会与他人共同分析问题、解决问题。

3. 增强学生的创新意识,鼓励尝试不同的编译技术,培养勇于探索的精神。

课程性质:本课程为计算机科学与技术专业核心课程,旨在教授编译原理的基本知识,提高学生的编程实践能力。

学生特点:学生已具备一定的编程基础,具有较强的逻辑思维能力和抽象思维能力。

教学要求:结合课程性质和学生特点,注重理论与实践相结合,强调动手实践,培养学生解决实际问题的能力。

通过课程目标的具体分解,使学生在掌握编译原理知识的同时,提高编程技能和团队协作能力。

二、教学内容1. 编译原理概述:介绍编译器的定义、编译过程、编译器的结构及其各阶段的作用。

教材章节:第1章 编译原理概述2. 词法分析:讲解词法分析的基本概念、词法分析器的功能、词法规则及其实现方法。

教材章节:第2章 词法分析3. 语法分析:介绍语法分析的基本概念、自上而下和自下而上的语法分析方法、语法分析器的实现技术。

教材章节:第3章 语法分析4. 语义分析:讲解语义分析的作用、类型检查、语义分析器的实现方法。

教材章节:第4章 语义分析5. 中间代码生成:介绍中间代码的定义、中间代码的表示形式、中间代码生成的方法。

教材章节:第5章 中间代码生成6. 代码优化:讲解代码优化的目的、基本优化方法、目标代码生成。

编译原理课程设计报告

编译原理课程设计报告

编译原理课程设计报告文档仅供参考编译原理课程设计——简单编译器的设计与实现班级:组长:组员:指导教师:设计时间:12 月文档仅供参考姓名分工组长:语法分析部分,语义分析和中间代码生成部分,符号表的管理,目标代码的生成,数据结构的设计和总体框架的设计。

组员:中间代码优化部分,负责从DAG图中获得优化后的四元式代码,以及将中间变量填写入符号表内。

组员:中间代码优化部分,负责优化DAG图的建立。

组员:词法分析部分,词法分析部分的符号表和错误表的记录。

文档仅供参考摘要 .......................................1.概述 .....................................2.课程设计任务及要求 .......................2.1 设计任务 ............................2.2 设计要求 ............................3.算法及数据结构 ...........................3.1算法的总体思想(流程) . ..............3.2词法分析模块 . ........................3.2.1功能 ...........................3.2.2数据结构 .......................3.2.3算法 ...........................3.3语法分析(含语义分析和中间代码生成)模块签。

3.3.1功能 ...........................3.3.2数据结构 .......................3.3.3算法 ...........................3.4中间代码优化模块 . ....................3.4.1功能 ...........................3.4.2数据结构 .......................3.4.3算法 ...........................3.5目标代码生成模块 . ....................3.5.1功能 ...........................错误 ! 未定义书签。

2015广工操作系统课程设计报告(文档最后含源码下载地址)

2015广工操作系统课程设计报告(文档最后含源码下载地址)

操作系统课程设计学生学院____ 计算机学院______ 专业班级 13级计科9 学号学生姓名指导教师李敏2015 年12 月29 日成绩一、课程设计介绍设计模拟一个实现多道批处理系统的两级调度。

通过具体的作业调度、进程调度、内存分配等功能的实现,加深对多道批处理系统的两级调度模型和实现过程的理解。

作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。

作业调度是高级调度,它的主要功能是根据一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。

进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。

在本次课程设计中假定系统可供用户使用的主存空间共100KB,并有4台磁带机。

主存分配采用可变分区分配方式且主存中信息不允许移动,对磁带机采用静态分配策略,作业调度分别采用先来先服务算法和最小作业优先算法,进程调度则采用先来先服务和最短进程优先算法。

二、课程设计环境1.计算机及操作系统:PC机,WindowsXP系统2.程序设计使用工具:Microsoft VisualC++ 6.03.程序设计语言:C语言三、课程设计思想假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。

测试数据如下:作业到达时间估计运行时间内存需要磁带机需要JOB1 10:00 25分钟15K 2台JOB2 10:20 30分钟60K 1台JOB3 10:30 10分钟50K 3台JOB4 10:35 20分钟10K 2台JOB5 10:40 15分钟30K 2台本次课程设计采用的是两个作业调度算法:先来先服务算法和短作业优先算法,两个进程调度算法:先来先服务算法,短进程优先算法。

系统根据所选算法组合对输入系统的作业进行两级调度(作业调度,进程调度)。

分别在不同算法控制下运行设计的程序,依次显示被选中作业、内存空闲区和磁带机的情况,输出不同算法作业的选中次序及作业平均周转时间。

《编译原理》设计方案报告

《编译原理》设计方案报告

《编译原理》设计方案报告一、项目概述二、课程目标本课程的主要目标是使学生能够掌握编译器的设计与实现原理,理解编译过程中的各个环节,以及掌握常见的编译器构建工具和技术。

具体目标如下:1.理解编译器的基本原理和工作流程;2.掌握常见的编译器构建工具和技术;3.能够独立设计和实现简单的编译器;4.培养学生的系统设计和问题解决能力。

三、课程内容本课程的主要内容包括:1.编译器的概念和基本原理;2.词法分析器和语法分析器的设计与实现;3.语义分析和中间代码生成;4.优化和目标代码生成;5.编译器构建工具和技术。

四、教学方法本课程采用以学生为中心的教学方法,主要包括以下几种教学手段:1.模块化教学:将课程内容分为多个模块,每个模块进行独立的教学和实践;2.理论与实践相结合:通过理论课、实验课等形式,使学生能够将理论知识应用到实际中;3.项目驱动教学:引入编译器设计与实现的实际项目,让学生能够在实践中巩固所学的知识;4.小组合作学习:将学生分成小组,进行协作学习,增强学生的团队合作能力。

五、评价方式为了评价学生对课程内容的掌握程度,本课程采用以下评价方式:1.平时成绩:包括课堂表现、作业和实验成绩等;2.项目成果:针对编译器设计与实现的项目,评价学生的项目成果和实现质量;3.期末考试:以闭卷考试形式对学生的总体掌握情况进行评价。

六、项目进度安排本课程的项目进度安排如下:1.第1-2周:介绍编译器的概念和基本原理;2.第3-6周:词法分析器和语法分析器的设计与实现;3.第7-9周:语义分析和中间代码生成;4.第10-12周:优化和目标代码生成;5.第13-14周:编译器构建工具和技术;6.第15-16周:项目演示和总结。

七、教学资源支持为了支持本课程的教学,我们将提供以下教学资源:1.教材:选用经典的编译原理教材,如《编译原理》(龙书)等;2.课件:编写详细的课件,包括理论知识和实践案例;3.实验指导:编写实验指导书,引导学生进行编译器设计与实现的实践;4. 实验环境:提供编译器构建工具和开发环境,如Lex/Flex、Yacc/Bison等。

编译课程设计报告

编译课程设计报告

编译课程设计报告一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、方法和算法,培养学生运用编译原理解决实际问题的能力。

具体目标如下:1.知识目标:(1)了解编译原理的基本概念,如编译器、源语言、目标语言等。

(2)掌握编译过程中的各个阶段,如词法分析、语法分析、语义分析、中间代码生成、目标代码生成等。

(3)熟悉常见编译优化技术,如代码简化、死代码消除、循环优化等。

(4)了解编译器实现的基本方法,如递归下降分析、LL分析、LR分析等。

2.技能目标:(1)能够使用编译原理相关工具,如lex、yacc等。

(2)具备简单的编译器设计与实现能力。

(3)能够分析程序的性能,并应用编译优化技术进行优化。

3.情感态度价值观目标:(1)培养学生对编译原理的兴趣,提高学生自主学习的积极性。

(2)培养学生团队合作精神,提高学生解决实际问题的能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理基本概念:介绍编译器、源语言、目标语言等基本概念。

2.编译过程及其各个阶段:讲解词法分析、语法分析、语义分析、中间代码生成、目标代码生成等阶段。

3.编译优化技术:介绍代码简化、死代码消除、循环优化等优化技术。

4.编译器实现方法:讲解递归下降分析、LL分析、LR分析等实现方法。

5.编译器工具使用:介绍lex、yacc等工具的使用方法。

6.编译器设计与实现:讲解编译器的设计与实现过程。

三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:用于讲解编译原理的基本概念、方法和算法。

2.讨论法:学生针对编译原理中的重点、难点问题进行讨论,提高学生的理解能力。

3.案例分析法:通过分析实际案例,使学生更好地掌握编译原理的应用。

4.实验法:让学生亲自动手实现简单的编译器,提高学生的实践能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。

1.教材:选用《编译原理》等权威教材,为学生提供系统、科学的学习资料。

编译原理课程设计报告(一个完整的编译器)

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。

一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。

源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。

2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。

另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。

交叉编译器在生成新的硬件平台时非常有用。

“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。

例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。

毕业论文-编译原理课程设计报告c-语言词法与语法分析器的实现

毕业论文-编译原理课程设计报告c-语言词法与语法分析器的实现

编译原理课程设计报告课题名称:编译原理课程设计C-语言词法与语法分析器的实现提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:指导教师评阅成绩:指导教师评阅意见:..提交报告时间:年月日C-词法与语法分析器的实现1.课程设计目标(1)题目实用性C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。

通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。

(2)C-语言的词法说明①语言的关键字:else if int return void while所有的关键字都是保留字,并且必须是小写。

②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */③其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。

小写和大写字母是有区别的。

④空格由空白、换行符和制表符组成。

空格通常被忽略。

⑤注释用通常的c语言符号/ * . . . * /围起来。

注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。

注释不能嵌套。

(3)程序设计目标能够对一个程序正确的进行词法及语法分析。

2.分析与设计(1)设计思想a.词法分析词法分析的实现主要利用有穷自动机理论。

有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。

通过有穷自动机理论能够容易的设计出词法分析器。

b.语法分析语法分析采用递归下降分析。

递归下降法是语法分析中最易懂的一种方法。

它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。

模板-编译原理课程设计实验报告

模板-编译原理课程设计实验报告

编译原理课程设计学院〔系〕:学生姓名:学号:班级:同组人:(、班级、学号)大连理工大学Dalian University of Technology1.3 论文正文格式 (1)1.4 章节标题格式 (1)1.5 各章之间的分隔符设置 (2)1.6 正文中的编号 (2)2 词法分析程序的实现 (3)2.1 图的格式说明 (3)2.1.1 图的格式例如 (3)2.1.2 图的格式描述 (3)2.2 表的格式说明 (4)2.2.1 表的格式例如 (4)2.2.2 表的格式描述 (5)2.3 公式的格式说明 (6)2.3.1 公式的格式例如 (6)2.3.2 公式的格式描述 (6)2.4 参考文献的格式说明 (6)2.4.1 参考文献在正文中引用的例如 (6)2.4.2 参考文献在正文中引用的书写格式 (6)2.4.3 参考文献的书写格式 (6)2.4.4 参考文献的书写格式例如 (7)2.5 量和单位的使用 (7)2.5.1 使用方法 (7)2.5.2 中华人民共和国法定计量单位 (7)2.6 标准表达注意事项 (11)2.6.1 名词术语 (11)2.6.2 数字 (11)2.6.3 外文字母 (11)2.6.4 量和单位 (12)2.6.5 标点符号 (12)编译原理课程设计3 递归下降法实现语法分析程序 (13)4 解释程序 (13)感想 (14)附录A 附录内容名称 (15)“正文”不可省略。

正文是毕业设计〔论文〕的主体,要着重反映设计或论文的工作,要突出毕业设计的设计过程、设计依据及解决问题的方法;毕业论文重点要突出研究的新见解,例如新思想、新观点、新规律、新研究方法、新结果等。

正文一般可包括:理论分析;试验装置和测试方法;对试验结果的分析讨论及理论计算结果的比较等。

正文要求论点正确,推理严谨,数据可靠,文字精练,条理分明,文字图表标准、清晰和整齐,在论文的行文上,要注意语句通顺,到达科技论文所必须具备的“正确、准确、明确”的要求。

(完整word版)2015广工操作系统实验报告(文档最后含源码下载地址)

(完整word版)2015广工操作系统实验报告(文档最后含源码下载地址)

操作系统实验报告学生学院____ 计算机学院______专业班级 13级计科9学 号学生姓名指导教师 李敏2015 年 12 月 29 日实验一进程调度实验一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

二、实验内容和要求设计一个有N个进程共行的进程调度程序。

要求采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),时间片轮转算法,多级反馈队列调度算法这三种算法。

每个进程有一个进程控制块(PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

三、实验主要仪器设备和材料实验环境硬件环境:IBM-PC或兼容机软件环境:C++、C语言编程环境四、实验方法1、编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。

“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。

静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。

动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。

编译原理课程设计报告

编译原理课程设计报告

2015级《编译原理课程设计》任务书一、课程设计的性质和目的编译原理课程设计是计算机专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握编译程序编写的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事高层次的计算机软件开发工作打下一定的专业基础。

二、设计课题课题一:应用编译原理的方法实现带括号的四则混合运算给定条件:1、词法符号定义如下:INTC → D+FLOATC → (D+.D+) | (D+.) | ( .D+)FLOATC →( (D+.D+) | (D+.) | ( .D+)| (D+) ) ( E | e ) ( + | − | λ ) D+OPADD → +OPSUB →−OPMUL → *OPDIV → /LPAREN →‘(’RPAREN →‘)’LINE →‘\n’ASSIGN → =2、表达式文法定义如下:01. S → E02. E → T03. E → E OPADD T04. E → E OPSUB T05. T → P06. T → T OPMUL P07. T → T OPDIV P08. P → INTC09. P → FLOATC10. P → LPAREN E RPAREN基本要求:1、以ASSIGN作为文法结束符号;2、应用词法分析技术识别单词;3、应用SLR(1)分析技术判别表达式的合法性;4、应用尾动作文法技术计算表达式的类型与值;5、要求表达式的类型与值严格一致。

课题二:Micro语言词法语法分析给定条件:1、词法符号定义如下:ID → L(L|D)*INTC → D+REALC → D+∙ D+PLUS → +MULT → *LPAREN → (RPAREN → )COLON →:ASSIGN →:=SEMI →;LINE →’\n’STOP →∙FEOF → EOF2、表达式文法定义如下:01. PROG →BEGIN DECL BODY END STOP02. DECL →DECL V AR ID COLON TYPE SEMI03. DECL →V AR ID COLON TYPE SEMI04. TYPE →REAL05. TYPE →INTEGER06. BODY →BODY SEMI STM07. BODY →STM08. STM →ID ASSIGN EXP09. STM →WRITE LPAREN EXP RPAREN10. STM →READ LPAREN ID RPAREN11. EXP →EXP PLUS FACT12. EXP →FACT13. FACT →FACT MULT PRIM14. FACT →PRIM15. PRIM →ID16. PRIM →INTC17. PRIM →REALC18. PRIM →LPAREN EXP RPAREN基本要求:1、以FEOF作为文法结束符号;2、应用词法分析技术识别单词;3、应用SLR(1)分析方法进行语法分析;4、报错要指明所在行。

编译原理毕业课程设计报告

编译原理毕业课程设计报告

(此文档为word格式,下载后您可任意编辑修改!) 编译原理课程设计报告一、分析通过设计,编制,调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

IF 〈布尔表达式〉THEN 〈赋值语句〉ELSE 〈赋值语句〉其中(1)、可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。

(2)、写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)、编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

二、算法设计程序要求有三部分组成,即词法分析、语法分析、以及语义分析。

其中词法分析部分要求完成对输入程序的关键字、标识符、常数、运算符进行识别;并分析词法分析的结果,检查程序输入的关键字是否为符合设计文法的关键字,检查标志符是否是合法标志符,识别运算符的种类。

语法分析部分主要是以算符优先文法的设计思想和步骤完成对词法分析结果的的语法分析工作,判断输入的程序是否符合设计的IF-THEN-ELSE文法。

在语法分析通过的基础上进行语义分析,其主要任务是完成对语法分析后的程序的语义分析,根据语法制导翻译去翻译输入的程序,从而得到程序的中间代码表示形式——四元式。

词法分析、语法分析和语义分析的流程图如下:(1)词法分析A 词法分析器的功能和输出形式输入:所给文法的源程序字符串输出:二元组(单词种别,单词符号的属性值)构成的序列B. 待分析的简单语言的词法因为是模拟简单编译器, 所以就以C语言的小型子集作为模拟编译器的词法.模拟程序语言的单词符号可分为下列五种;关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于Pascal语言中的end ) 所有的关键字都是小写字母 .运算符: + , - , * , , = , < , <= , == , > , >= ,<> , && ,|| , !界符: 逗号 ,分号 ,左圆括号 , 右圆括号 , #常数: 在这里只涉及到int型常量其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID = letter(letter|digit)*NUM = digit digit *空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。

广东工业大学2015编译原理课程设计

广东工业大学2015编译原理课程设计

编译原理课程设计报告课程名称____编译原理课程设计_题目名称PL/0编译器的扩充学生学院__计算机学院______专业班级___学号______学生姓名____指导教师______张巍2015年12月27日一.课程设计目的及要求基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:+=,-=,*=和/=(2)扩充语句(Pascal的FOR语句):FOR<变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>选做内容(成绩评定范围扩大到:“优”和“良”)增加注释;注释由/*和*/包含;二.概述1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;2、目标语言:生成文件后缀为*.COD的目标代码3、实现平台(平台):Borland C++Builder64、运行平台:Windows xp三.结构设计说明各功能模块概述过程或函数名简要功能说明pl0主程序error出错处理,打印出错位置和错误编码getsym词法分析,读取一个单词getch漏掉空格,读取一个字符gen生成目标代码,并送入目标程序区test测试当前单词符号是否合法block分程序分析处理过程enter登录名字表position查找标识符在名字表中的位置constdeclaration常量定义处理vardeclaration变量说明处理listode列出目标代码清单statement语句处理expression表达式处理term项处理factor因子处理condition条件处理interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址四.主要成分描述(1)符号表为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址)。

这些值是由编译程序本身联系到相应标识符上去的。

编译原理课程设计报告模板-推荐下载

编译原理课程设计报告模板-推荐下载
2 课程设计内容
用 MFC 编写一个可视化的 MiniC 编译器,要求界面美观,使用方便,能够实现自定义 MiniC 语言的编译。 支持的语句和运算: (1)数据类型:int,char,void,float (2)语句:赋值(=),if, while,for (3)数学运算:+,-,*,/ (4)关系运算:==,>,<,>=,<=,!= (5)逻辑运算:&&,||,! (6)支持函数的定义、调用 (7)支持复合语句,即 {} 包含的语句 (8)注释: C 类型的多行注释 /* */ 和 C++ 类型的单行注释 //
目录
1 课程设计目的 ...........................................................................................1
2 课程设计内容 ...........................................................................................1
5 系统设计与实现 .......................................................................................8
5.1 BY13 编译器的主要功能模块....................................................................................................8 5.2 词法分析子程序 ..........................................................................................................................8 5.3 语法语义分析子程序 ..................................................................................................................8

编译原理课设报告最终版

编译原理课设报告最终版

一、设计目的研究、改进或自行设计、开发一个简单的编译程序或其部分功能,加深对编译理论和编译过程的理解。

编程语言不限。

二、设计任务扩展 PL/0 编译程序功能目的: 扩充 PL/0 编译程序功能要求: (1)阅读、研究 PL/0 编译程序源文件。

(2)在上述工作基础上,可有选择地补充、完善其中词法分析、语法分析、语义分析、目标代码生成、目标代码解释执行等部分的功能。

如以语法分析部分为例,则可以增加处理更多语法成分的功能,如可处理一维数组、++、--、+=、-=、*=、/=、%(取余)、!(取反)、repeat、for、else、开方、处理注释、错误提示、标示符或变量中可以有下划线等。

还可以增加类型,如增加字符类型、实数类型; 扩充函数如有返回值和返回语句的,有参数函数等;(3)设计编制典型的运行实例,以便能反映出自己所作的改进。

三、设计思想:PL/0 语言可以看成PASCAL 语言的子集,它的编译程序是一个编译解释执行系统。

PL/0 的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0 语言可在配备PASCAL 语言的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。

当源程序编译正确时,PL/0 编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

四、设计内容:1扩充语句for(<语句>;<条件>;<语句>)<语句>;2扩充语句if <条件> then <语句> else <语句>;3扩充语句repeat <语句>;until <条件>;4增加自增自减运算++和—和+=,-=运算;5修改不等号#,为!=;6增加一维数组声明格式:<ident>[<ident>/<number>:<ident>/<number>]; 赋值格式:<ident>[<index>]:=<表达式>; 调用格式:<ident>[<index>]五、程序结构:PL/0源程序图1 编译程序结构 图2功能模块调用1.功能模块作用如下:Pl0.c :主程序Error :出错处理,打印出错位置和错误编码 Getsym :词法分析,读取一个单词 Getch :漏掉空格,读取一个字符Gen :生成目标代码,并送入目标程序区 Test :测试当前符号是否合法Block :分程序分析处理过程,词法语法分析 Enter :登陆名字表Position :查找标识符在名字表中的位置Constdeclaration:常量定义处理Vardeclaraction:变量说明处理Listcode:列出目标代码清单Statement:语句处理Expression:表达式处理Term:项处理Factor:因子处理Condition:条件处理Interpret:对目标代码的解释执行程序Base:通过静态链求出数据取得基地址增加两个功能:Arraydeclaration:数组声明处理Arraycoef:数组索引计算和“虚拟机”动作生成2.保留字:enum 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,elsesym,forsym, inc, dec, whilesym, writesym,readsym, dosym, callsym, constsym,varsym,procsym, repeatsym, untilsym, plusbk, minusbk,lbrack, rbrack, colon,}共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk,Lbrack, rbrack, colon3.名字表中的类型enum object{ constant, variable, procedure, arrays, }共4个,扩充arrays,以便实现数组4.虚拟机代码enum fct { lit, opr, lod, sto, cal, inte, jmp, jpc, lda, sta, }共10个,补充的lda,sta用于数组操作6.错误信息(1)const,var,procedure后应为标识符(2) 常数说明中的=后应是数字(3)常数说明中的标识符后应是=(4)常数说明中的=写成了:=(5)漏掉了,或;(6)过程说明后的符号不正确(应是语句开始符,或过程定义符)(7)应是语句开始符(8)标识符未说明(9)程序结尾丢了句号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计课程名称___编译原理__________题目名称___PL/0编译器的扩充__学生学院___计算机学院_________专业班级_计算机科学与技术13(9)学号学生姓名指导教师___林志毅________________ 2016年1月2日一、已完成的内容:(1)扩充赋值运算:*=和/=(2)扩充语句(Pascal的FOR语句)FOR<变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(3)增加类型:①字符类型;②实数类型。

(4)增加注释;多行注释由/*和*/包含,单行注释为//二、实验环境与工具(1)计算机及操作系统:PC机,Windows7(2)程序设计语言:C++(3)使用软件Borland C++Builder6.0(4)教学型编译程序:PL/0三、具体实现:1.扩充赋值运算:*=和/=(1)语法树变量*=表达式(2)修改GetSym()方法(写出修改的代码)else if(CH=='*'){GetCh();if(CH=='='){SYM=TIMESBECOMES;GetCh();}else SYM=TIMES;}else if(CH=='/'){GetCh();if(CH=='='){SYM=SLASHBECOMES;GetCh();}(3)修改STATEMENT()方法(写出修改的代码)case IDENT:i=POSITION(ID,TX);if(i==0)Error(11);else if(TABLE[i].KIND==VARIABLE||TABLE[i].KIND==FLOATTYPE) {/*ASSIGNMENT TO NON-VARIABLE*/GetSym();if(SYM==BECOMES||SYM==TIMESBECOMES|| SYM==SLASHBECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES){RELOP=SYM;if(SYM!=BECOMES){//若为除等于(或其他类似符号)则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}GetSym();}else Error(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES){GEN(OPR,0,4);}else if(RELOP==SLASHBECOMES){GEN(OPR,0,5);}else if(RELOP==PLUSBECOMES){GEN(OPR,0,2);}else if(RELOP==MINUSBECOMES){GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(4)运行测试(测试的PL0源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAM EX01;VAR A,B,C,D;BEGINA:=16;A/=2;WRITE(A);//结果为8B:=4;B*=2;WRITE(B);//结果为8C:=6;C+=2;WRITE(C);//结果为8D:=10;D-=2;WRITE(D);//结果为8END.(5)运行结果:(6)出现的问题及解决开始时在实现/=和*=操作时,*=的实现很顺利,而/=却一直没有得到理想的结果,通过与同学的讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。

解决:在调用EXPRESSION函数解析/=右边表达式前,先将其左边变量的值放入栈中。

2.扩充语句(Pascal的FOR语句)FOR<变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(1)语法图(2)修改GetSym()方法(写出修改的代码)此处无修改,FOR、STEP、UNTIL及DO等关键字已放置关键字数组中,通过该数组便可识别。

(3)修改STATEMENT()方法(写出修改的代码)case FORSYM:GetSym();STATEMENT(SymSetUnion(SymSetNew(STEPSYM),FSYS),LEV,TX);//处理for后面的赋值语句CX3=CX;GEN(JMP,0,0);//用于第一次执行for语句时跳过step语句CX1=CX;//记录step后语句的代码位置if(SYM==STEPSYM){GetSym();STATEMENT(SymSetUnion(SymSetNew(UNTILSYM),FSYS),LEV,TX);//处理step后面的表达式}else Error(8);if(SYM==UNTILSYM){CODE[CX3].A=CX;//回填第一次进入for循环时的直接跳转地址GetSym();}else Error(8);CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX);//处理条件语句if(SYM==DOSYM){GetSym();}else Error(8);CX2=CX;GEN(JPC,0,0);//条件跳转,栈顶若为非真,则跳转到参数三位置,该位置待回填STATEMENT(FSYS,LEV,TX);//处理do后面内容GEN(JMP,0,CX1);//执行完for语句内的语句则重新跳回step处CODE[CX2].A=CX;//回填条件跳转break;(4)运行测试PL0源码:PROGRAM EX01;VAR A,SUM;BEGINSUM:=0;FOR A:=1STEP A+=1UNTIL A<=100DO//求1~100的和SUM+=A;WRITE(SUM);//结果为5050END.(5)运行结果:(6)出现的问题及解决实现FOR循环的前提是理解表达式处理函数及语句处理函数,关键是处理好跳转关系,例如第一次进入FOR循环时,生成FOR后面的表达式后应该有一个直接跳转跳过STEP语句进入UNTIL的条件判断;而调用CONDITION处理UNTIL后的条件语句后,便有一个条件跳转跳到STEP后的表达式代码位置。

由于有了之前IF...ELSE...的参考及大致理解相关函数,因此实现时没出现太大问题。

3.增加类型:①字符类型;②实数类型。

(1)在GetSym中增加字符型及实数型数据的识别else if(CH=='\''){GetCh();NUM=CH;GetCh();if(CH=='\''){SYM=CHARACTER;GetCh();}else Error(8);}else if(CH>='0'&&CH<='9'){/*NUMBER*/K=0;NUM=0;SYM=NUMBER;do{NUM=10*NUM+(CH-'0');K++;GetCh();}while(CH>='0'&&CH<='9');if(CH=='.'){//实现小数点后的识别i=0;M=0;GetCh();while(CH>='0'&&CH<='9'){//以下获取小数点后的值J=0;M=(CH-'0')*0.1;while(J<i){M*=0.1;J++;}NUM=NUM+M;i++;GetCh();}if(i>LMAX)Error(30);//LMAX为小数点后数字最大度fprintf(FOUT,"%f",NUM);}(2)修改Block中的方法运行测试if(SYM==CHARSYM){GetSym();do{CharDeclaration(LEV,TX,DX);while(SYM==COMMA){GetSym();CharDeclaration(LEV,TX,DX);}if(SYM==SEMICOLON)GetSym();else Error(5);}while(SYM==IDENT);}if(SYM==FLOATSYM){GetSym();do{FloatDeclaration(LEV,TX,DX);while(SYM==COMMA){GetSym();DoubleDeclaration(LEV,TX,DX);}if(SYM==SEMICOLON)GetSym();else Error(5);}while(SYM==IDENT);}(3)修改STATEMENT中的方法case IDENT:GetSym();i=POSITION(ID,TX);if(i==0)Error(11);else if(TABLE[i].KIND==CHARTYPE||TABLE[i].KIND==VARIABLE|| TABLE[i].KIND==FLOATTYPE){/*ASSIGNMENT TO NON-VARIABLE*/if(SYM==BECOMES||SYM==TIMESBECOMES|| SYM==SLASHBECOMES||SYM==PLUSBECOMES|| SYM==MINUSBECOMES){RELOP=SYM;if(SYM!=BECOMES){//若为除等于(或其他类似)。

则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}GetSym();}else Error(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES){GEN(OPR,0,4);}else if(RELOP==SLASHBECOMES){GEN(OPR,0,5);}else if(RELOP==PLUSBECOMES){GEN(OPR,0,2);}else if(RELOP==MINUSBECOMES){GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}else{Error(12);i=0;}break;case WRITESYM://根据不同类型进行相应输出GetSym();if(SYM==LPAREN){do{GetSym();EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);i=POSITION(ID,TX);switch(TABLE[i].KIND){case CHARTYPE:GEN(OPR,0,17);break;case FLOATTYPE:GEN(OPR,0,18);break;default:{GEN(OPR,0,14);}}}while(SYM==COMMA);if(SYM!=RPAREN)Error(SBNUM);else GetSym();}GEN(OPR,0,15);break;/*WRITESYM*/(4)修改FACTOR中的方法(包含字符的识别处理)while(SymIn(SYM,FACBEGSYS)){if(SYM==IDENT){i=POSITION(ID,TX);if(i==0)Error(11);elseswitch(TABLE[i].KIND){case CONSTANT:GEN(LIT,0,TABLE[i].VAL);break;case VARIABLE: GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);break;case PROCEDUR:Error(21);break;case FLOATTYPE: GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);break;case CHARTYPE:GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);break;}GetSym();}else if(SYM==NUMBER){if(NUM>AMAX){Error(31);NUM=0;}GEN(LIT,0,NUM);GetSym();//将表达式中的数字置于栈顶}else if(SYM==LPAREN){//左括号GetSym();EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX);if(SYM==RPAREN)GetSym();else Error(22);}else if(SYM==CHARACTER){GEN(LIT,0,NUM);//将字符放入栈顶GetSym();}(5)修改ENTER中的方法case CHARTYPE:TABLE[TX].vp.LEVEL=LEV;TABLE[TX].vp.ADR=DX;DX++;break;case FLOATTYPE:TABLE[TX].vp.LEVEL=LEV;TABLE[TX].vp.ADR=DX;DX++;break;(6)在Interpret指令OPR中增加字符输出和实数输出case17:Form1->printcs(S[T]);fprintf(FOUT,"%c\n",S[T]);T--;//增加字符输出break;case18:Form1->printrs("",S[T]);fprintf(FOUT,"%d\n",S[T]);T--;//增加实数型输出break;(7)其它修改1)增加相应的关键字char和float;2)由于增加实型,因此将模拟栈的数组类型改为double型;另目标指令结构体INSTRUCTION中的A,及全局变量NUM也改为double型(8)运行测试:PL0源码:PROGRAM EX01;CHAR A,B;FLOAT C,D,SUM;BEGINA:='A';B:='B'+2;WRITE(A);WRITE(B);WRITE(B+2);C:=123.321;D:=321.123;SUM:=C+D+0.0004;WRITE(SUM);END.(9)运行结果:(10)出现的问题及解决字符型的实现主要问题是在赋值、字符表达式的处理及输出三个方面。

相关文档
最新文档