版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理课程设计报告编译原理课程设计报告班级:_1611102_学号:_161110202_姓 名:_潘诗映_2014-01-01一、设计任务l 课程设计题目一个PASCAL语言子集(PL/0)编译器的设计与实现l PL/0语言的BNF描述(扩充的巴克斯范式表示法)<prog> program <id>;<block><block> <condecl><vardecl><proc><body><condecl> const <const>,<const><c
2、onst> <id>:=<integer><vardecl> var <id>,<id><proc> procedure <id>(<id>,<id>);<block><proc><body> begin <statement><statement>end<statement> <id> := <exp> |if <lexp> then <statement>el
3、se <statement> |while <lexp> do <statement> |call <id>(<exp>,<exp>) |<body> |read (<id>,<id>) |write (<exp>,<exp>)<lexp> <exp> <lop> <exp>|odd <exp><exp> +|-<term><aop><term><te
4、rm> <factor><mop><factor><factor><id>|<integer>|(<exp>)<lop> =|<>|<|<=|>|>=<aop> +|-<mop> *|/<id> ll|d (注:l表示字母)<integer> dd注释:<prog>:程序 ;<block>:块、程序体 ;<condecl>:常量说明 ;<const>:常量;<
5、;vardecl>:变量说明 ;<proc>:分程序 ; <body>:复合语句 ;<statement>:语句;<exp>:表达式 ;<lexp>:条件 ;<term>:项 ; <factor>:因子 ;<aop>:加法运算符;<mop>:乘法运算符; <lop>:关系运算符。l 假想目标机的代码LIT 0 ,a 取常量a放入数据栈栈顶OPR 0 ,a 执行运算,a表示执行某种运算LOD L ,a 取变量(相对地址为a,层差为L)放到数据栈的栈顶STO L ,a 将数
6、据栈栈顶的内容存入变量(相对地址为a,层次差为L)CAL L ,a 调用过程(转子指令)(入口地址为a,层次差为L)INT 0 ,a 数据栈栈顶指针增加aJMP 0 ,a无条件转移到地址为a的指令JPC 0 ,a 条件转移指令,转移到地址为a的指令RED L ,a 读数据并存入变量(相对地址为a,层次差为L)WRT 0 ,0 将栈顶内容输出代码的具体形式:F L A其中:F段代表伪操作码 L段代表调用层与说明层的层差值 A段代表位移量(相对地址)进一步说明:INT:为被调用的过程(包括主过程)在运行栈S中开辟数据区,这时A段为所需数据单元个数(包括三个连接数据);L段恒为0。CAL:调用过程,
7、这时A段为被调用过程的过程体(过程体之前一条指令)在目标程序区的入口地址。LIT:将常量送到运行栈S的栈顶,这时A段为常量值。LOD:将变量送到运行栈S的栈顶,这时A段为变量所在说明层中的相对位置。STO:将运行栈S的栈顶内容送入某个变量单元中,A段为变量所在说明层中的相对位置。JMP:无条件转移,这时A段为转向地址(目标程序)。JPC:条件转移,当运行栈S的栈顶的布尔值为假(0)时,则转向A段所指目标程序地址;否则顺序执行。OPR:关系或算术运算,A段指明具体运算,例如A=2代表算术运算“”;A12代表关系运算“>”;A16代表“读入”操作等等。运算对象取自运行栈S的栈顶及次栈顶。l
8、假想机的结构两个存储器:存储器CODE,用来存放P的代码 数据存储器STACK(栈)用来动态分配数据空间四个寄存器:一个指令寄存器I:存放当前要执行的代码一个栈顶指示器寄存器T:指向数据栈STACK的栈顶一个基地址寄存器B:存放当前运行过程的数据区在STACK中的起始地址一个程序地址寄存器P:存放下一条要执行的指令地址该假想机没有供运算用的寄存器。所有运算都要在数据栈STACK的栈顶两个单元之间进行,并用运算结果取代原来的两个运算对象而保留在栈顶。l 活动记录:RADLSLRA:返回地址DL:调用者的活动记录首地址SL:保存该过程直接外层的活动记录首地址过程返回可以看成是执行一个特殊的OPR运
9、算注意:层次差为调用层次与定义层次的差值l 程序实现要求PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现。其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。用表格管理程序建立变量、常量和过程标示符的说明与引用之间的信息联系。用出
10、错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错位性质。当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。l 时间要求按照规定,编译课程设计时间为一周。18周末提交。二、功能结构设计PL/0编译程序源语言(PL/0) 目标语言(类 pcode)实现语言(C+)PL/0 语言程序 类 pcode代码 PL/0 类 pcode C+ 程序结构流程:PL/0源程序PL/0编译程序类 pcode代码类 pcode解释程序 输入 输出PL/0编译程序包含词法分析器、语法分析器、类pcode解释执行程序三个大块,其中
11、语法分析中包含了语义分析,中间代生成,确定分析过程中均没有错误后对中间代码进行解释执行。否则在相应出错位置报错PL/0源程序程序结构:词法分析程序语法语义分析程序代码生成程序表格管理程序出错处理程序目标程序以语法语义分析为核心,调用词法分析得到单词,配合表格管理生成中间代码,出错则调用出错处理程序处理,否则解释执行中间代码词法分析器的作用与实现:从txt文件中读取PL/0语言编写的源程序,每次获取一个单词。通过每次读取文件中的一个字符实现,若读取的字符为空字符,换行符,则跳过,直至取到第一个有效字符,继续读取字符,直至生成一个有效的字符串,如遇到不可识别字符则报错。返回有效单词的单词种别码,内
12、容,和值,用Word结构体实现,同时输出单词的内容。语法分析的功能与实现:语法分析每次调用词法分析器产生一个单词,并对之进行识别和处理。语法分析以一个表达式为单位,读到相应单词则进入处理该单词的入口函数,均无入口则报错,途中遇到均无相应产生式可产生该句子的单词也报错。出错处理主要有报告该单词不可识别,或该单词前缺少什么字符这两类报错。由于在词法分析中已经输出该单词的内容,所以相当于整个源程序都会被输出,则相应出错地方则很容易被识别并能帮助修改。部分错误如缺少read后缺少(等错误可报错后继续识别,不影响后续代码的分析,但有些错误,如多了+等可能导致后续字符不能识别,但错误控制在一个表达式内。同
13、时在语法分析中包含了静态语义检查,如使用的变量是否已经定义等。生成的中间代码操作码经过编号,存储编号即可中间代码的解释执行的功能与实现:为中间代码的操作码赋予含义动作,如“+”是栈顶与次栈顶项相加,并退两个栈元素,使结果值进栈。单词种别和属性表单词符号种别码 单词符号种别码program1:=19procedure2<20const3<=21begin4>22var5>=23If6=24Then7<>25else8+26while9-27do10*28end11/29call12;30read13,31 write14(32 odd15)3334lettet
14、(letter|digit)*1735dight dight*1836单词内部保存于识别多依赖编码Pcode指令编号1LIT 0 a将常数取至栈顶,a为常数值2LOD l a将变量取至栈顶,a为偏移量,1为层差3STO l a将栈顶元素送至某内存单元,a为偏移量,l为层差4CAL 1 a调用过程,a为过程地址,l为层差5INT 0 a在运行栈中为被调用的过程开辟a个单元的数据区6JMP 0 a无条件跳转至a地址7JPC 0 a条件跳转,当栈顶布尔值非真跳转至a地址,否则顺序执行8OPR 0 0调用过程结束后,返回调用点并退栈9OPR 0 1栈顶元素取反10OPR 0 2次栈顶与栈顶元素相加,退
15、两个栈,结果值进栈11OPR 03次栈顶减去栈顶,退两个栈元素,结果值进栈12OPR 04次栈顶乘以栈顶,退两个栈元素,结果值进栈13OPR05次栈顶除以栈顶,退两个栈元素,结果值进栈14OPR06栈顶元素值奇偶判断,结果值进栈15OPR07次栈顶与栈顶是否相等,退两个栈元素,结果值进栈16OPR08次栈顶与栈项是否不等,退两个栈元素,结果值进栈17OPR09次栈顶是否小于栈顶项,退两个栈元素,结果值进栈18OPR010次栈顶是否小于等于栈顶项,退两个栈元素,结果值进栈19OPR011次栈顶是否大于栈顶项,退两个栈元素,结果值进栈20OPR012次栈顶是否大于等于栈顶项,退两个栈元素,结果值进
16、栈21OPR013栈值输出至屏幕22OPR014命令行将一项写入栈顶在保存中间代码时,对操作进行编码,共8个,即LIT到OPR三、 函数说明栈,结构体,全局变量的定义#define TRUE 1;#define FALSE 0;#define KEYsym 15 /15个关键字int success=1; /编译成功,有错则置0struct Word /词法分析过后返回单词包含的信息char sym20;int code;int num;struct SYM /符号表保存的信息char name20; /新标识符的名称int type; /类型int offset; /相对地址int leve
17、l; /层数int paranum; /每个过程说明所占用的空间,只在过程名称有定义int num; /值,过程则写入需要回填的语句下标int size; /过程的大小;struct PCode /中间代码保存的信息int f; /伪操作码int l; /层差int a; /偏移量;PCode Code500; /代码栈SYM Table200; /符号表int Wback100; /保存回填语句下标int STACK200; /数据栈int bcount=0; /需要回填语句的个数int TOP=0; /符号表栈顶int LEVEL=0; /当前层数int cx=0,tx; /Code的下标
18、指针,Table的下标指针PCode I; /当前执行指令int T,B,P; /栈顶指示寄存器,基地址寄存器,程序地址寄存器词法分析器:int IsLetter(char ch); /判断是否为字母 void GetBC(fstream &file,char &ch); /检查ch中的字符是否为空白void Concat(char str,char ch); /拼接函数int IsDigit (char ch); /判断时候是否为数字 int Reserve(char kt10,char str); /判断时候是否为关键字 void Retract(fstream &
19、file); /将搜索指示器回调一个字符位置int CharToInt(char str); /字符型向整型转化VoidGetChar(fstream&file,char&ch); /从文件中读取一个字符到chvoid cifa(fstream &file,Word &w); /词法分析器语法分析器:(包含语义分析和中间代码生成)int Factor(fstream &file ,Word &w); /因子void prog(fstream &file,Word &w); /主过程void Proc(fstream &fi
20、le ,Word &w); /子过程void Condecl(fstream &file ,Word &w); /常量void Vardecl(fstream &file ,Word &w); /变量void Term(fstream &file ,Word &w); /项void Exp(fstream &file ,Word &w); /表达式void Lexp(fstream &file ,Word &w); /条件int Statement(fstream &file ,Word &w); /语句void Body(fstream &file ,Word &w); /复合语句void Block(fstream &file ,Word &w); /块int End(Word &w); /程序是否已编译完成void yufa(fstream &file) /语法分析语义分析:void Enter(SYM &s); /变量常量过程说明,加入符号表int Position(Word &w,SYM &s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年茂名市电白区电城中学招聘合同制教师备考题库及一套完整答案详解
- 半年个人工作总结10篇
- 2025年浦发银行昆明分行公开招聘备考题库及一套参考答案详解
- 2026年兴业银行广州分行校园招聘备考题库及1套完整答案详解
- 十八项核心制度
- 2025国考银行结构化面试试题及答案解析
- 2025年关于为淄博市检察机关公开招聘聘用制书记员的备考题库含答案详解
- 2025年中国科学院力学研究所SKZ专项办公室人员招聘备考题库及一套答案详解
- 2025年重庆大学工业母机创新研究院劳务派遣工程师招聘备考题库(长期有效)完整答案详解
- 黑龙江公安警官职业学院《战略管理》2025 学年第二学期期末试卷
- 中华联合财产保险股份有限公司2026年校园招聘备考题库及一套完整答案详解
- 诗经中的爱情课件
- 2025年烟花爆竹经营单位安全管理人员考试试题及答案
- 2025天津大学管理岗位集中招聘15人参考笔试试题及答案解析
- 2025年云南省人民检察院聘用制书记员招聘(22人)考试笔试参考题库及答案解析
- TCAMET02002-2019城市轨道交通预埋槽道及套筒技术规范
- 24- 解析:吉林省长春市2024届高三一模历史试题(解析版)
- 临床护士工作现状分析
- 电力线路架设安全操作方案
- 桥台钢筋专项施工方案
- (正式版)DB65∕T 4229-2019 《肉牛、肉羊全混合日粮(∕TMR)搅拌机》
评论
0/150
提交评论