ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:40.48KB ,
资源ID:8113004      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-8113004.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最新版编译原理毕业课程设计与报告.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

最新版编译原理毕业课程设计与报告.docx

1、最新版编译原理毕业课程设计与报告课 程 设 计 课程名称_ 编译原理 _题目名称 PL/0语言的扩充 学生学院_ 计算机学院_专业班级_ 软件工程07级4班_学 号 学生姓名 指导教师_ 李小妹_ 2008 年 1 月 5 日课程设计实验报告一、概述:源语言: PL/0目标语言: 目标代码(生成的文件后缀为*.COD)实验工具: Borland C+Builder 6运行平台: WindowsXP目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。达到进一步了解程序编译过程的基本原理和基本实现方法的目的。要求:对PL/0作以下

2、修改扩充:基本内容(1)扩充赋值运算:+= 和 -=(2)扩充语句(Pascal的FOR语句):FOR := TO DO FOR := DOWNTO DO 其中,语句的循环变量的步长为1,语句的循环变量的步长为-1。选做内容 (1)增加运算:+ 和 -。(2)增加类型: 字符类型; 实数类型。(3)扩充函数: 有返回值和返回语句; 有参数函数。(4)增加一维数组类型(可增加指令)。(5)其他典型语言设施。二、结构设计说明:各功能模块描述Error()出错处理,打印出错位置和错误编码GetCh()漏掉空格,读取一个字符GetSym() 词法分析,读取一个单词 GEN()目标代码生成过程,本过程用

3、于把生成的目标代码写入目标代码数组,供后面的解释器解释执行TEST() 测试当前单词是否合法过程testENTER() 登陆符号表过程enterPOSITION() 在符号表中查找指定符号所在位置的函数position VARDECLARATION()变量声明处理LISTCODE()输出目标代码清单;FACTOR() 因子处理过程factorTERM() 项处理过程term; EXPRESSION() 表达式处理过程CONDITION() 条件处理过程STATEMENT() 语句处理过程BLOCK() 编译程序主体,语法分析过程 BASE()通过静态链求出数据区基地址的函数,INTERPRET

4、 ()对目标代码解释运行过程Pl0编译程序的结构编译程序的总体流程图 词法分析状态转换图. 表示状态,对应每个状态编一段程序,每个状态调用取字符程序,根据当前字符转到不同的状态,并做相应操作。 表示终态,已识别出一个单词语法调用关系图主要成分描述1.符号表在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同

5、。因为每遍所关心的信息各有差异。一张符号表的每一项(或称入口才包含两大栏(或称区段、字域),即名字栏(NAME) 信息栏(INFORMATION) 信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,由于查填符号表一般是通过匹配名字来寮现的,因此,名字栏也称主栏。主栏的内容称为关键字(key word)。 2.运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。源程序的标识符存放在TABLE表中,目标代码存放在CODE中,S是由解释程序定义的一维整型数组,是程序运行时的数据存储空间。3.语法分析方法自顶向下的语法分析: . VAR ; A BEG

6、IN END READ ( ) A4.中间代码表示对PL/0编译程序的目标代码的指令格式描述如下: f l a其中f代表功能码,l表示层次差,a的含意对不同的指令有所区别,见下面对每条指令的解释说明:lit 0 a将常数值取到栈顶,a为常数值Lod l a将变量值取到栈顶,a为偏移量,l为层差Sto l a将栈顶内容送入某变量单元中,a为偏移量,l为层差Cal l a调用过程,a为过程地址,l为层差Int 0 a在运行栈中为被调用的过程开辟a个单元的数据区jmp 0 a无条件跳转至a地址Jpc 0 a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行opr 0 0过程调用结束后,返回调用点

7、并退栈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次栈顶与栈顶是否不等,退两个栈元素,结果值进栈opr 0 10次栈顶是否小于栈顶,退两个栈元素,结果值进栈opr 0 11次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈opr 0 12次栈顶是否大于栈顶,退两个栈元

8、素,结果值进栈opr 0 13次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈opr 0 14栈顶值输出至屏幕opr 0 15屏幕输出换行opr 0 16从命令行读入一个输入置于栈顶三、程序代码:扩充后修改的部分代码typedef enum 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,

9、 WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM, PLUSBK, MINUSBK, SQLPAREN,SQRPAREN, INC, DEC, ELSESYM, FORSYM, TOSYM, DOWNTOSYM, RETURNSYM SYMBOL;/添加SQLPAREN,SQRPAREN,INC,DEC,ELSESYM,FORSYM,TOSYM,DOWNTOSYM ,RETURNSYM char *SYMOUT = NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLAS

10、H, 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, PROGSYM, PLUSBK, MINUSBK, SQLPAREN,SQRPAREN, INC, DEC,ELSESYM, FORSYM, TOSYM, DOWNTOSYM, RETURNSYM ; /添

11、加INC,DEC,ELSESYM,FORSYM,TOSYM,DOWNTOSYM /设置保留字名字 strcpy(KWORD 1,BEGIN); strcpy(KWORD 2,CALL); strcpy(KWORD 3,CONST); strcpy(KWORD 4,DO); strcpy(KWORD 5,DOWNTO); /downto strcpy(KWORD 6,ELSE); /else strcpy(KWORD 7,END); strcpy(KWORD 8,FOR); /for strcpy(KWORD 9,IF); strcpy(KWORD10,ODD); strcpy(KWORD11,

12、PROCEDURE); strcpy(KWORD12,PROGRAM); strcpy(KWORD13,READ); strcpy(KWORD14,RETURN); /return strcpy(KWORD15,THEN); strcpy(KWORD16,TO); /to strcpy(KWORD17,VAR); strcpy(KWORD18,WHILE); strcpy(KWORD19,WRITE); /设置保留字符号 WSYM 1=BEGINSYM; WSYM 2=CALLSYM; WSYM 3=CONSTSYM; WSYM 4=DOSYM; WSYM 5=DOWNTOSYM; /down

13、to WSYM 6=ELSESYM; /else WSYM 7=ENDSYM; WSYM 8=FORSYM; /for WSYM 9=IFSYM; WSYM10=ODDSYM; WSYM11=PROCSYM; WSYM12=PROGSYM; WSYM13=READSYM; WSYM14=RETURNSYM; /return WSYM15=THENSYM; WSYM16=TOSYM; /to WSYM17=VARSYM; WSYM18=WHILESYM; WSYM19=WRITESYM;词法分析,获取一个符号void GetSym() long i,J,K; ALFA A; while (CH=

14、A & CH=Z) /*ID OR RESERVED WORD*/ K=0; do if (K=A & CH=0 & CH=9); AK=0; strcpy(ID,A); i=1; J=NORW; do K=(i+J) / 2; if (strcmp(ID,KWORDK)=0) i=K+1; while(i J) SYM=WSYMK; /if(SYM=ELSESYM) else SYM=IDENT; else if (CH=0 & CH=0 & CHNMAX) Error(30); else if (CH=:) GetCh(); if (CH=) SYM=BECOMES; GetCh(); e

15、lse SYM=NUL; else /* THE FOLLOWING TWO CHECK WERE ADDED BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR = */ if (CH=) SYM=NEQ; GetCh(); /3 修改不等号 else SYM=LSS; else if (CH=) GetCh(); if (CH=) SYM=GEQ; GetCh(); else SYM=GTR; else /4添加+=,-=,+,- if(CH=+) GetCh(); if(CH=) SYM=PLUSBK; GetCh(); else if(

16、CH=+) SYM=INC; GetCh(); else SYM=PLUS; else if(CH=-) GetCh(); if(CH=) SYM=MINUSBK; GetCh(); else if(CH=-) SYM=DEC; GetCh(); else SYM=MINUS; else if(CH=/) char c=LINECC; if(c=/) CC=LL;/for(int i=0;iprintls(JJJ,55); SYM=SLASH; GetCh(); else SYM=SSYMCH; GetCh(); /语句处理void STATEMENT(SYMSET FSYS,int LEV,

17、int &TX) /*STATEMENT*/ int i,CX1,CX2,CX3,tm=0,jk=0; FCT STOMode3=STO,STOARR,STOVAR; FCT LODMode3=LOD,LODARR,LODVAR; SYMBOL Temp; switch (SYM) case IDENT: i=POSITION(ID,TX); if (i=0) Error(11); else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/ Error(12); i=0; GetSym(); switch(SYM) /添加INC

18、,DEC,PLUSBK,MINUSBK case BECOMES: GetSym(); EXPRESSION(FSYS,LEV,TX); if(i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); break; case INC: /+运算 GetSym(); GEN(LODModejk,LEV-TABLEi.vp.LEVEL+tm,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); GEN(STOModejk,LEV-TABLEi.vp.LEVEL+tm,TABLEi.vp.ADR); break; case

19、DEC: /-运算 GetSym(); GEN(LODModejk,LEV-TABLEi.vp.LEVEL+tm,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,3); GEN(STOModejk,LEV-TABLEi.vp.LEVEL+tm,TABLEi.vp.ADR); break; case PLUSBK: case MINUSBK: int flag=SYM; /flag是一个局部整型变量 GetSym(); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); EXPRESSION(FSYS,LEV,TX); if(f

20、lag=PLUSBK) GEN(OPR,0,2); else GEN(OPR,0,3); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); break; / default: Error(13); GetSym(); break; case READSYM: GetSym(); if (SYM!=LPAREN) Error(34); else do GetSym(); if (SYM=IDENT) i=POSITION(ID,TX); else i=0; if (i=0) Error(35); else GEN(OPR,0,16); GEN(STO,LEV

21、-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); while(SYM=COMMA); if (SYM!=RPAREN) Error(33); while (!SymIn(SYM,FSYS) GetSym(); else GetSym(); break; /* READSYM */ case WRITESYM: GetSym(); if (SYM=LPAREN) do GetSym(); EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX); GEN(OPR,0,14); while(SYM=

22、COMMA); if (SYM!=RPAREN) Error(33); else GetSym(); GEN(OPR,0,15); break; /*WRITESYM*/ case CALLSYM: GetSym(); if (SYM!=IDENT) Error(14); else i=POSITION(ID,TX); if (i=0) Error(11); GetSym(); if(SYM=LPAREN) GetSym(); int k=0; EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX); GEN(PUSH,0,k)

23、; k+; while(SYM=COMMA) GetSym(); EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX); GEN(PUSH,0,k); k+; if(SYM=RPAREN) GetSym(); else Form1-printls(错误CALL,400); /String s=IntToStr(i); /Form1-printls(s.c_str(),700); GEN(CAL,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else if (TABLEi.KIND=PROCEDUR)

24、GEN(CAL,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else Error(15); break; case IFSYM: GetSym(); CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM,ELSESYM),FSYS),LEV,TX); if (SYM=THENSYM) GetSym(); else Error(16); CX1=CX; GEN(JPC,0,0); STATEMENT(SymSetUnion(SymSetNew(IDENT,ELSESYM,SEMICOLON),FSYS),LEV,TX); if(S

25、YM!=SEMICOLON) Form1-printls(错误IF,300); else GetSym(); if(SYM!=ELSESYM) b=1; CODECX1.A=CX; return; else /6 添加else GetSym(); CX2=CX; GEN(JMP,0,0); STATEMENT(FSYS,LEV,TX); CODECX1.A=CX2+1; CODECX2.A=CX; break; case BEGINSYM: GetSym(); STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX); wh

26、ile (SYM=IDENT|SymIn(SYM, SymSetAdd(SEMICOLON,STATBEGSYS) if (SYM=SEMICOLON|b) if(b) b=0; else GetSym(); else Error(10); STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX); if (SYM=ENDSYM) GetSym(); else Error(17); break; case WHILESYM: CX1=CX; GetSym(); CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX); CX2=CX; GEN(JPC,0,0); if (SYM=DOSYM) GetSym(

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2