编译原理课程设计--C语言编译器实现.doc_第1页
编译原理课程设计--C语言编译器实现.doc_第2页
编译原理课程设计--C语言编译器实现.doc_第3页
编译原理课程设计--C语言编译器实现.doc_第4页
编译原理课程设计--C语言编译器实现.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

甘肃政法学院编译原理课程设计题 目 C语言编译器实现计算机科学学院计算机科学与技术专业10 级 计本 班学 号: 201081010137 姓 名: 杨青虎 指导教师: 李 霞 完成时间: 2013 年 6 月 目 录一、 原理11、简介12、单词符号及种别表示13、语法结构定义如下:2二、运行环境3三、 算法设计思想31、词法分析主要算法32、语法分析主要算法33、语义分析主要算法4四、 程序流程图5五、运行测试结果8六、心得体会9七、源代码9C语言编译器实现一、 原理1、简介 编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。表格管理出错处理单词符号语法单元中间代码中间代码目标代码语法分析器语义分析与中间代码生成器优化器目标代码生成器词法分析器2、单词符号及种别表示1单词符号种别编码main1int 2float3double4char5if 6else 7do8while9l(l|d)*10dd* 20=21+22- 23* 24/ 25(26)272829,30;3132=3334=35=36!=3701000ERROR-13、语法结构定义如下: := main() := :=;:=|:=ID= :=if :=do while := := +|- := *|/ :=ID|num|() := |=|=|!二、运行环境Windows 系统 Visual C+ 6.0三、 算法设计思想1、词法分析主要算法这部分对源文件进行分析,允许/* */注释。从源文件依次读取字符,对字符进行分析,组成字符串、数字、关系符等固定含义的token符,并把它们添加到token链中,如果遇到非法字符报错并退出程序。2、语法分析主要算法这部分对Token链进行分析,利用自底向上的分析方法,构建SLR(1)分析表的过程是手工完成的。语法分析的同时构建语法树,移进时创建叶子,规约时创建节点。3、语义分析主要算法这部分对语法树从左到右进行遍历,节点记录了规约式的编号,遍历到节点时就进行相应处理。语义分析主要检查变量、函数是否被定义或重定义,同时产生四元式。函数一览表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(); char* T(); char* F(); char *newTemp(); void backpatch(int p,int t); int merge(int p1,int p2); void emit(char *res,char *num1,char *op,char *num2);四元组结构体定义:structchar result10; char arg110;char opera10;char arg210;fourCom20;四、 程序流程图初始化调用scanner读下一个单词符号调用irparser循环输出四元式fourcom结束图1 主函数流程图是否main否是调用scanner是否是(否调用scanner是是否是)否是调用scanner出错处理调用语句块分析函数stablock图2 递归下降分析分析程序流程图 是否是否是调用scanner调用语句串分析函数stastring调用scanner出错处理是否是否图3 语句块分析流程图调用语句分析函数sta回溯,调用backpatch是否是;否调用scanner是出错处理调用语句分析函数sta图4 语句串分析流程图是否是字符串调用赋值语句分析函数fuzhi是否是否是if否是调用条件语句分析函数tiaojian是否是do否是调用循环语句分析函数xunhuan图5 语句分析流程图五、运行测试结果正确程序结果错误程序结果:报错!(1)错误程序结果:报错!(2)六、心得体会这次的课程设计,最大的收获就是清楚了编译的整个过程,在学习编译原理这门课程之时,在做设计的过程中和词法分析、语法分析、语义分析联系起来, 非常清晰的理解了简单编译器实现过程。读完了一个完整的源程序,知道了它里面的功能模快以及结构组织,也明白了编译的基本原理.。在实验中加深了在课堂上说学到编译原理知识的理解,实验中实践了书本上的知识和原理。通过这次课程设计也使我认识到自己的不足。首先这些代码我并不能独立完成,而是在网上查阅了大量资料,以及在许多同学的帮助下才完成的。其次平时对编译原理的各个部分理解的不错,平时实验做的也还可以,只是在做这次的课程设计的时候需要把整个编译的过程整体的思路搞清楚。通过看以前的笔记和课本,我了解了各个阶段间的连接,最终使得本次课程设计的顺利完成。七、源代码#include#include#include#includechar prog80; char token8; char ch; int syn,p,m,n,i; double sum; int count; int isSignal; int isError;int 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;structchar result10; char arg110;char opera10;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(); char* T(); char* F(); char *newTemp(); void backpatch(int p,int t); int merge(int p1,int p2); void emit(char *res,char *num1,char *op,char *num2); void main()p=0;count=0;isDecimal=0;index=0;repeat=0;kk=0;printf(n请输入待编译程序:n);doch=getchar();progp+=ch;while(ch!=#);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) scanner();if(syn=26) scanner();if(syn=27)scanner();staBlock(&nChain);elseprintf(缺少右括号n);else printf(缺少左括号n);elseprintf(缺少mainn);void staBlock(int *nChain) if(syn=28) scanner();staString(nChain);if(syn=29) scanner(); elseprintf(缺少号n);elseprintf(缺少号n);void staString(int *nChain) sta(nChain);backpatch(*nChain,nextq);while(syn=31) scanner();sta(nChain);void sta(int *nChain) if(syn=10)fuzhi();else if(syn=6) tiaojian(nChain);else if(syn=8) xunhuan();void tiaojian(int *nChain)char res10,num110,num210,op10;int nChainTemp;if(syn=6) scanner();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:printf(error);scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);ntc=nextq; emit(0,if,num1,goto); nfc=nextq; emit(0,goto);backpatch(ntc,nextq); if(syn=27) scanner();staBlock(&nChainTemp); *nChain=merge(nChainTemp,nfc);void xunhuan()char res10,num110,num210,op10;int nChainTemp;if(syn=8) nnc=nextq; scanner();staBlock(&nChainTemp); if(syn=9) scanner();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:printf(error);scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);nnb=nextq;emit(0,if,num1,goto); backpatch(nnb,nnc);nna=nextq;emit(0,goto);backpatch(nna,nextq);if(syn=27) scanner();void fuzhi() char res10,num10; if(syn=10) strcpy(res,token);scanner();if(syn=21) scanner();strcpy(num,E();emit(res,num,=,);elseprintf(缺少=号n);char* E()char *res,*num1,*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,+);elsestrcpy(op,-);scanner();strcpy(num2,T();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* T() 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,*);elsestrcpy(op,/);scanner();strcpy(num2,F();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* F() 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;elseisError=1;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;void backpatch(int p,int t) int w,circle=p;while(circle)w=atoi(fourComcircle.result); sprintf(fourComcircle.result,%d,t);circle=w; return;int merge(int p1,int p2) char circle,nResult;if(p2=0)nResult=p1;elsenResult=circle=p2;while(atoi(fourComcircle.result)circle=atoi(fourComcircle.result); sprintf(fourComcircle.result,%s,p1);return nResult; 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=a)&(ch=A)&(ch=0)&(ch=9) tokenm+=ch; ch=progp+; tokenm+=0; p-; syn=10; for(n=0;n=0)&(ch=0)&(ch=0)&(ch=0)&(ch=9) index=index*10+ch-0; ch=progp+; if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); if(isSignal=1)sum=-sum;isSignal=0;p-; syn=20; else switch(ch) case : m=0; tokenm+=ch; ch=progp+; if(ch=) syn=33; tokenm+=ch; else syn=32;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论