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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理 简单编译器课程设计报告.docx

1、编译原理 简单编译器课程设计报告信息科学与工程学院课程设计任务书 题目: 一个简单编译器的设计与分析 姓 名: 学 号: 专业班级: 课 程: 编译原理 指导教师: 职称: 讲 师 完成时间: 2011年 12 月-2011年 12 月枣庄学院信息科学与工程学院制2011年12 月20日课程设计任务书及成绩评定课程设计的任务和具体要求在理解编译原理相关理论的基础上,要求用C或C+语言描述及上机调试,实现一个小编译器(包括符号表的构造,词法分析,语法分析,语义分析,目标代码生成等重要子程序,其中词法分析、语法分析及语义分析功能必须完成),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全

2、面训练,从而提高学生软件开发的能力。指导教师签字: _ 日期: 指导教师评语成绩:_ 指导教师签字: 日期: 课程设计所需软件、硬件等硬件环境:WindowsXP/Win7操作系统 软件环境:Microsoft visual C+6.0课程设计进度计划起至日期工作内容备注2011-12-01052011-12-06102011-12-1116查找资料理清思路,编写程序完善程序,编辑文档参考文献、资料索引序号文献、资料名称编著者出版单位【1】程序设计语言编译原理 陈火旺 李春林 国防工业出版社【2】数据结构 严蔚敏 清华大学出版社【3】C+程序设计 吴乃林 况迎辉 高等教育出版社【4】C语言程序

3、设计 谭浩强 清华大学出版社【5】程序设计语言编译原理 陈火旺、刘春林等 国防工业出版社一、摘要编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而

4、上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。下图给出了编译系统的结构框图 二、总体设计方案及主要设计原

5、理2.1、单词符号及种别表示单词符号种别编码单词值main1int 2float3double4char5if 6else 7do8while9l(l|d)*10内部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) dd*|) 20二进制数值表示=21+22- 23* 24/ 25(26)272829,30;3132=3334=35=36!=372.2、语法结构定义 := main() := /程序用括号括起来:=;:=|:=ID= /赋值语句用”=”号:=if /条件怎么没有括号,囧(自己加1个):=do while := := +|- := *|/ :=ID|num

6、|()num:= ( +|-| ) 数字*(.数字数字* | )( e ( +|-| ) 数字数字*|)ID:=字母(字母|d数字)*字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9 := |=|=|!=2.3、主要算法2.3.1、词法分析主要算法这部分对源文件进行分析,允许/* */注释。从源文件依次读取字符,对字符进行分析,组成字符串、数字、关系符等固定含义的token符,并把它们添加到token链中,如果遇到非法字符报错并退出程序。2.3.2、语法分析主要思想这部分对Token链进行分析,利用自底向上的分析方法,构建SLR(1)分析表的过程是手工完成的。语法分析的同时构建语法

7、树,移进时创建叶子,规约时创建节点。2.3.3、语义分析主要分析这部分对语法树从左到右进行遍历,节点记录了规约式的编号,遍历到节点时就进行相应处理。语义分析主要检查变量、函数是否被定义或重定义,同时产生四元式。三、源程序代码#include#include#include#includechar prog80; /存放所有输入字符 char token8; /存放词组 char ch; /单个字符 int syn,p,m,n,i; /syn:种别编码 double sum; int count; int isSignal; /是否带正负号(0不带,1负号,2正号)int isError;int

8、 isDecimal; /是否是小数 double decimal; /小数 int isExp; /是否是指数 int index; /指数幂 int isNegative; /是否带负号 double temp; int temp2;int repeat; /是否连续出现+,-int nextq;int kk; /临时变量的标号int ntc,nfc,nnc,nnb,nna;char *rwtab9=main,int,float,double,char,if,else,do,while;struct char result10; /字符串(字符数组) char arg110; char o

9、pera10; char arg210;fourCom20; /结构体数组void scanner(); /扫描void lrparser(); void staBlock(int *nChain); /语句块void staString(int *nChain); /语句串void sta(int *nChain); /语句void fuzhi(); /赋值语句void tiaojian(int *nChain); /条件语句void xunhuan(); /循环语句char* E(); /Expresiion表达式char* T(); /Term项char* F(); /Factor因子c

10、har *newTemp(); /自动生成临时变量void backpatch(int p,int t); /回填int merge(int p1,int p2); /合并p1和p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式void main() p=0; count=0; isDecimal=0; index=0; repeat=0; kk=0; printf(nPlease input your source string:n); do ch=getchar(); progp+=ch; while(ch!=#);

11、p=0; isError=0; scanner(); lrparser(); for(i=1;inextq;i+) /循环输出四元式 printf(n%dt,i); printf(%5s %5s %5s t%5s )n,fourComi.arg1,fourComi.opera,fourComi.arg2,fourComi.result); void lrparser() int nChain; nfc=ntc=1; nextq=1; if(syn=1) /main scanner(); if(syn=26) /( scanner(); if(syn=27) /) scanner(); staB

12、lock(&nChain); else printf(缺少右括号n); else printf(缺少左括号n); else printf(缺少mainn);/ := void staBlock(int *nChain) /语句块 if(syn=28) / scanner(); staString(nChain); /backpatch(*nChain,nextq); if(syn=29) / scanner(); /读下一个 else printf(缺少号n); else printf(缺少号n);/:=;void staString(int *nChain) /语句串 sta(nChain)

13、; backpatch(*nChain,nextq); while(syn=31) /; scanner(); sta(nChain); /backpatch(*nChain,nextq-1);void sta(int *nChain) /语句 if(syn=10) fuzhi(); /*nChain=0; else if(syn=6) /if tiaojian(nChain); else if(syn=8) /do xunhuan();/-if()void tiaojian(int *nChain) char res10,num110,num210,op10; int nChainTemp;

14、 /- if(syn=6) /if scanner(); /strcpy(num1,E(); if(syn=26) /( scanner(); strcpy(num1,E(); if(syn=32) switch(syn) case 32: strcpy(op,); break; case 33: strcpy(op,=); break; case 34: strcpy(op,); break; case 35: strcpy(op,=); break; case 36: strcpy(op,=); break; case 37: strcpy(op,!=); break; default:

15、printf(error); scanner(); strcpy(num2,E(); strcat(num1,op); strcat(num1,num2); /nfc=nextq+1; ntc=nextq; /记住if语句位置 emit(0,if,num1,goto); nfc=nextq; /if中表达式为假 emit(0,goto); /第一个0已回填 backpatch(ntc,nextq); /ntc链接的所有四元式都回填nextq if(syn=27) /) scanner(); staBlock(&nChainTemp); /语句块 *nChain=merge(nChainTemp

16、,nfc); /:=do while void xunhuan() char res10,num110,num210,op10; int nChainTemp; if(syn=8) /do nnc=nextq; /记住if语句位置,emit之后nextq就变了 /emit(0,if,num1,goto); scanner(); staBlock(&nChainTemp); /语句块 if(syn=9) /while scanner(); if(syn=26) /( scanner(); strcpy(num1,E(); if(syn=32) switch(syn) case 32: strcp

17、y(op,); break; case 33: strcpy(op,=); break; case 34: strcpy(op,); break; case 35: strcpy(op,=); break; case 36: strcpy(op,=); break; case 37: strcpy(op,!=); break; default: printf(error); scanner(); strcpy(num2,E(); strcat(num1,op); strcat(num1,num2); nnb=nextq; emit(0,if,num1,goto); backpatch(nnb,

18、nnc); nna=nextq; emit(0,goto); backpatch(nna,nextq); if(syn=27) /) scanner(); void fuzhi() /赋值语句只有1个操作数 char res10,num10; /num操作数 if(syn=10) /字符串 strcpy(res,token); /结果 scanner(); if(syn=21) /= scanner(); strcpy(num,E(); emit(res,num,=,); else printf(缺少=号n); char* E() /Expression表达式 char *res,*num1,

19、*op,*num2; res=(char *)malloc(10); num1=(char *)malloc(10); op=(char *)malloc(10); num2=(char *)malloc(10); strcpy(num1,T(); while(syn=22)|(syn=23) /+ - if(syn=22) /+ strcpy(op,+); else strcpy(op,-); scanner(); strcpy(num2,T(); strcpy(res,newTemp(); emit(res,num1,op,num2); strcpy(num1,res); return n

20、um1;char* T() /Term项 char *res,*num1,*op,*num2; res=(char *)malloc(10); num1=(char *)malloc(10); op=(char *)malloc(10); num2=(char *)malloc(10); strcpy(num1,F(); while(syn=24)|(syn=25) /* / if(syn=24) strcpy(op,*); else strcpy(op,/); scanner(); strcpy(num2,F(); strcpy(res,newTemp(); emit(res,num1,op

21、,num2); strcpy(num1,res); return num1;char* F() /Factor因子 char *res; res=(char *)malloc(10); if(syn=10) /字符串 strcpy(res,token); scanner(); else if(syn=20) /二进制数 itoa(int)sum,res,10); /整数转换为字符串 scanner(); else if(syn=26) /( scanner(); res=E(); if(syn=27) /) scanner(); else isError=1; else isError=1;

22、return res;char *newTemp() char *p; char varTemp10; p=(char *)malloc(10); kk+; itoa(kk,varTemp,10); strcpy(p+1,varTemp); p0=T; return p;/将p所链接的每个四元式的第四个分量都回填tvoid backpatch(int p,int t) int w,circle=p; while(circle) /circle不为0的时候 w=atoi(fourComcircle.result); /四元式circle第四分量内容 /strcpy(fourComcircle.r

23、esult,t); /把t填进四元式circle的第四分量 sprintf(fourComcircle.result,%d,t); circle=w; /w记录的是链条上下一个四元式,移动! return;int merge(int p1,int p2) /合并p1和p2 char circle,nResult; if(p2=0) nResult=p1; else nResult=circle=p2; while(atoi(fourComcircle.result) /四元式第四个分量不为0 circle=atoi(fourComcircle.result); /strcpy(fourComc

24、ircle.result,p1); sprintf(fourComcircle.result,%s,p1); /目的是用p1的值覆盖0 return nResult; /p2是头,p1覆盖0,接在p2后边void emit(char *res,char *num1,char *op,char *num2) strcpy(fourComnextq.result,res); strcpy(fourComnextq.arg1,num1); strcpy(fourComnextq.opera,op); strcpy(fourComnextq.arg2,num2); nextq+;void scanner() sum=0; decimal=0; m=0; for(n=0;n=a)&(ch=A)&(ch=Z) /ch是字母字符 whi

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1