您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 广东工业大学10级编译原理课程设计报告
《编译原理》课程设计实验时间:实验班级:姓名:焦王学号:实验教师:计算机学院广东工业大学一、基本内容(1)扩充赋值运算:*=和/=(2)扩充语句(Pascal的FOR语句):①FOR变量:=表达式TO表达式DO语句②FOR变量:=表达式DOWNTO表达式DO语句其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。(3)增加运算:++和--。(4)选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型:①字符类型;②实数类型。(2)扩充函数:①有返回值和返回语句;②有参数函数。(3)增加一维数组类型(可增加指令)。(4)其他典型语言设施。二、实验环境与工具(1)计算机及操作系统:PC机,Windows7,WindowsXP(2)程序设计语言:C++Builder5,VC6.0(3)教学型编译程序:PL/0三、设计方案(1)概述:源、目标语言,实现工具(平台),运行平台源语言:PL/0语言目标语言:类PCODE实现工具:C++Builder运行平台:windows7(2)结构设计说明--各功能模块描述1、intPOSITION(ALFAID,intTX):查找标识符在名字表中的位置2、intBASE(intL,intB,intS[]):通过静态链求出数据区的基地址3、voidError(intn):错误处理,打印出错位置和错误编码4、voidGetCh():漏掉空格,读取一个字符5、voidGetSym():词法分析,读取一个单词6、voidGEN(FCTX,intY,intZ):生成目标代码,并送入目标程序区7、voidTEST(SYMSETS1,SYMSETS2,intN):测试当前单词符号是否合法8、voidENTER(OBJECTSK,intLEV,int&TX,int&DX):登录名字表9、voidConstDeclaration(intLEV,int&TX,int&DX):常量说明处理10、voidVarDeclaration(intLEV,int&TX,int&DX):变量说明处理11、voidCharDeclaration(intLEV,int&TX,int&DX):字符说明处理12、voidRealDeclaration(intLEV,int&TX,int&DX):实数说明处理13、voidListCode(intCX0):列出目标代码清单14、voidFACTOR(SYMSETFSYS,intLEV,int&TX):因子处理15、voidTERM(SYMSETFSYS,intLEV,int&TX):项处理16、voidEXPRESSION(SYMSETFSYS,intLEV,int&TX):表达式处理17、voidCONDITION(SYMSETFSYS,intLEV,int&TX):条件处理18、voidSTATEMENT(SYMSETFSYS,intLEV,int&TX):语句部分处理19、voidBlock(intLEV,intTX,SYMSETFSYS):分程序分析处理过程20、voidInterpret():对目标代码的解释执行程序21、void__fastcallTForm1::ButtonRunClick(TObject*Sender):进行编译,RUN(3)主要成分描述①符号表符号表的主要功能如下:1、收集符号属性2、上下文语义合法性检查的依据3、作为目标代码生成阶段地址分配的依据②运行时存储组织和管理解释程序定义了4个寄存器:1、指令寄存器.存放当前正在解释的一条目标指令2、程序地址寄存器.指向下一条要执行的目标程序的地址3、栈顶寄存器.4、基址寄存器.指向每个过程被调用时,在数据区S中给它分配原则的数据段起始地址,也称基地址.当源程序经过语法分析,如果未发现错误时,由编译程序调用解释程序,对存放在CODE中的代码CODE[0]开始进行解释执行.当废弃结束后,记录源程序中标识符的TABLE表已没有作用.因此存储区只需以数组CODE存储的只读目标程序和运行机制时的数据区S,S是由解释程序定义的一维整数型数组.解释执行时的数据空间S为栈式计算机的在座空间,遵循后进先出规则,对每个过程(包括主程序)当调用时,才分配数据空间,退出过程进,则所分配原则的数据空间被释放.③语法分析方法语法分析研究从读入第一个单词开始由非终结符程序即开始符出发,沿语法描述图箭头所指出的方向进行分析.当遇到非终结符时,则调用相应的处理过程,从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进行分析,当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,则执行相应的语义程序(就是翻译程序).再读取下一个单词继续分析.遇到分支点时将当前的单词与分支点上的多个终结符逐个相比较,若都不匹配时可能是进入下一非终结符语法单位或是出错.如果一个PL/0语言程序的单词序列在整修语法分析中,都能逐个得到匹配,直到程序结束’.’,这时就说所输入的程序是正确的.对于正确的语法分析做相应的语义翻译,最终得出目标程序.④中间代码表示中间代码表示格式如下:fLa其中f代表功能码,l表示层次差,也就是变量或过程被引用的分程序与说明该变量或过程的分程序之间的层次差.a的含意对不同的指令有所区别,见下面对每条指令解释说明.LIT0A将常数值取到栈顶,A为常数值LODLA将变量值取到栈顶,A为偏移量,L为层差STOLA将栈顶内容送入某一变量单元中,A为偏移量,L为层差CALLA调用过程,A为过程地址,L为层差INT0A在运行栈中为被调用的过程开辟A个单元的数据区JMP0A无条件跳转到A地址JPC0A条件跳转,当栈顶布尔值非真则跳转到A地址,否则顺序执行OPR00过程调用结束后,返回调用点并退栈OPR01栈顶元素取反OPR02次栈顶与栈顶相加,退两个栈元素,结果值进栈OPR03次栈顶减去栈顶,退两个栈元素,结果值进栈OPR04次栈顶乘以栈顶,退两个栈元素,结果值进栈OPR05次栈顶除以栈顶,退两个栈元素,结果值进栈OPR06栈顶元素的奇偶判断,结果值在栈顶OPR07OPR08次栈顶与栈顶是否相等,退两上栈元素,结果值进栈OPR09次栈顶与栈顶是否不等,退两个栈元素,结果值进栈OPR010次栈顶是否小于栈顶,退两个栈元素,结果值进栈OPR011次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈OPR012次栈顶是否大于栈顶,退两个栈元素,结果值进栈OPR013次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈OPR014栈顶值输出到屏幕OPR015屏幕输出换行OPR016从命令行读入一个输入置于栈顶(4)测试用例①测试文件名:E01.plo测试对象:*=、/=、++、--、FOR、TO、DOWNTOE01的具体测试代码:PROGRAMEX01;VARA,B,C,Y;BEGINA:=9;B:=10;A++;WRITE(A);B--;WRITE(B);A/=3;WRITE(A);B*=2;WRITE(B);C:=A+B*(A-3);WRITE(C);FORY:=1TO5DOWRITE(Y);FORY:=5DOWNTO1DOWRITE(Y);END.测试结果:②测试文件名:E0101.plo测试对象:CHAR和REAL②测试文件名:E010101.plo测试对象:数组四、开发过程和完成情况1)开发过程:先往typedefenumchar*SYMOUT[]加入:TEQL,SEQL,DPLUS,DMINUS,ELSESYM,FORSYM,TOSYM,DOWNTOSYM,RETURNSYM,CHARSYM,REALSYM,LEFTS,RIGHTS,MIDD①++(DPLUS)——(DMINUS)*=(TEQL)/=(SEQL)先往voidGetSym()添加识别elseif(CH=='+'){GetCh();if(CH=='+'){SYM=DPLUS;GetCh();}elseSYM=PLUS;}elseif(CH=='-'){GetCh();if(CH=='-'){SYM=DMINUS;GetCh();}elseSYM=MINUS;}elseif(CH=='*'){GetCh();if(CH=='='){SYM=TEQL;GetCh();}elseSYM=TIMES;}elseif(CH=='/'){GetCh();if(CH=='='){SYM=SEQL;GetCh();}elseSYM=SLASH;}再往voidFACTOR(SYMSETFSYS,intLEV,int&TX)添加因子处理if(SYM==DPLUS){GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,2);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GetSym();}if(SYM==DMINUS){GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,3);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GetSym();}elseif(SYM==DPLUS){GetSym();i=POSITION(ID,TX);if(i==0)Error(11);elseif(TABLE[i].KIND!=VARIABLE){Error(12);i=0;}GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,2);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GetSym();}elseif(SYM==DMINUS){GetSym();i=POSITION(ID,TX);if(i==0)Error(11);elseif(TABLE[i].KIND!=VARIABLE){Error(12);i=0;}GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,3);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GetSym();}最后往voidSTATEMENT(SYMSETFSYS,intLEV,int&TX)添加elseif(SYM==TEQL){GetSym();GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);EXPRESSION(FSYS,LEV,TX);GEN(OPR,0,4);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}elseif(SYM==SEQL){GetSym();GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);EXPRESSION(FSYS,LEV,TX);GEN(OPR,0,5);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}elseif(SYM==DPLUS){GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,2);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//TABLE[i].VAL=NUM;GetSym();}elseif(SYM==DMI
本文标题:广东工业大学10级编译原理课程设计报告
链接地址:https://www.777doc.com/doc-7303787 .html