编译原理课程设计报告_编译器实现

上传人:ZJ****1 文档编号:57920014 上传时间:2018-10-25 格式:DOC 页数:34 大小:302.50KB
返回 下载 相关 举报
编译原理课程设计报告_编译器实现_第1页
第1页 / 共34页
编译原理课程设计报告_编译器实现_第2页
第2页 / 共34页
编译原理课程设计报告_编译器实现_第3页
第3页 / 共34页
编译原理课程设计报告_编译器实现_第4页
第4页 / 共34页
编译原理课程设计报告_编译器实现_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《编译原理课程设计报告_编译器实现》由会员分享,可在线阅读,更多相关《编译原理课程设计报告_编译器实现(34页珍藏版)》请在金锄头文库上搜索。

1、软件工程 0801 班 和春辰 U200818016 编译技术课程设计1 / 34编译技术编译技术课程设计课程设计 实验报告实验报告实验名称:编译器程序实验名称:编译器程序姓名:和春辰学号:U200818016班级:软件工程 0801 班指导老师:胡福林2010 年 11 月 12 日软件工程 0801 班 和春辰 U200818016 编译技术课程设计2 / 34目录目录一、课设要求3 二、总体设计思想 4 三、详细算法设计 4 四、流程框图5 五、函数相关说明 9 1.所有函数一览 9 2.void emit(char *res,char *num1,char *op,char *num2

2、)9 3.char *newTemp()10 4.int merge(int p1,int p2).10 5.void backpatch(int p,int t).11 6.void fuzhi()11 7.void tiaojian(int *nChain)12 8.void xunhuan()13六、程序运行结果 15 七、编译器使用说明 17 八、心得与体会 17 九、源程序清单 18软件工程 0801 班 和春辰 U200818016 编译技术课程设计3 / 34一、一、课设要求课设要求用 C 语言对下述文法和单词表定义的语言设计编制一个编译器。(1)单词符号及种别表单词符号种别编码

3、单词值main1int 2float3double4char5if 6else 7do8while9l(l|d)*10内部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) dd*|) 20二进制数值表示=21+22- 23* 24/ 25(26)272829,30;3132=33:= main() := /程序用括号括起来程序用括号括起来:=;软件工程 0801 班 和春辰 U200818016 编译技术课程设计4 / 34:=|:=ID= /赋值语句用赋值语句用”=”号号:=if /条件怎么没有括号,囧(自己加条件怎么没有括号,囧(自己加 1 个)个):=do whi

4、le := /没有布尔运算,还算简单没有布尔运算,还算简单:= +|-|-:= *|/|/:=ID|num|()num:= ( +|-| ) 数字*(.数字数字* | )( e ( +|-| ) 数字数字*|)ID:=字母(字母|d 数字)*字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9:= |=|=|!=二、二、总体设计思想总体设计思想采用递归下降(自上而下)的语法制导翻译法。三、三、详细算法设计详细算法设计在前两次试验的基础上改进。词法分析程序 语法分析程序 语义分析程序 编 译器。不断完善,不断改进。渐变的过程。软件工程 0801 班 和春辰 U200818016 编译技术

5、课程设计5 / 34四、四、流程框图流程框图图 I 主函数示意图软件工程 0801 班 和春辰 U200818016 编译技术课程设计6 / 34是否为 main?调用 scanner是否为(?调用 scanner是否为)?调用 scanner调用语句块分析函数 staBlock出错处理否否否是否为 ?调用 scanner调用语句串分析函数 staString调用 scanner是否为 ?出错处理否否图 II 递归下降分析程序示意图图 III 语句块分析示意图软件工程 0801 班 和春辰 U200818016 编译技术课程设计7 / 34调用语句分析函数 sta回溯,调用 backpatch

6、是否为 ; ?调用 scanner调用语句分析函数 sta否出错处理图 IV 语句串分析示意图软件工程 0801 班 和春辰 U200818016 编译技术课程设计8 / 34调用赋值语句分析函数 fuzhi是否为 字符串?是否为 if ?调用条件语句分析函数 tiaojian是否为 do ?调用循环语句分析函数 xunhuan图 V 语句分析示意图软件工程 0801 班 和春辰 U200818016 编译技术课程设计9 / 34五、五、函数相关说明函数相关说明1. 所有函数一览所有函数一览void scanner(); /扫描 void lrparser(); void staBlock(i

7、nt *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 因子 char *newTemp(); /自动生成临时变量 void backpatch(int p,int t); /回填 int merge(int p1,

8、int p2); /合并 p1 和 p2 void emit(char *res,char *num1,char *op,char *num2); /生成四元式2. void emit(char *res,char *num1,char *op,char *num2)该函数的功能是生成一个三地址语句送到四元式表中。 void emit(char *res,char *num1,char *op,char *num2) strcpy(fourComq.result,res); strcpy(fourComq.arg1,num1); strcpy(fourComq.opera,op); strcp

9、y(fourComq.arg2,num2); q+; 四元式表中的结构如下: structchar result10; /字符串(字符数组) char arg110; /操作数 1 char opera10; /运算符 char arg210; /操作数 2 fourCom20; /结构体数组软件工程 0801 班 和春辰 U200818016 编译技术课程设计10 / 343. char *newTemp()该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是 T1,T2,T3,. char *newTemp() char *p; char varTemp10; p=(char *)m

10、alloc(10); kk+;itoa(kk,varTemp,10); /整数转换为字符串 strcpy(p+1,varTemp);p0=T; /字符串前加 T,便于识别 return p; 4. int merge(int p1,int p2)该函数的功能是将以 P1,P2 为链首的两条链合并成一条链,返回时的函数值作为合并 后的链首。 int merge(int p1,int p2) /合并 p1 和 p2 char circle,nResult; if(p2=0) nResult=p1; else nResult=circle=p2;while(atoi(fourComcircle.re

11、sult) /四元式第四个分量不为 0 circle=atoi(fourComcircle.result); /strcpy(fourComcircle.result,p1); sprintf(fourComcircle.result,“%s“,p1); /目的是用 p1 的值覆盖 0 return nResult; /p2 是头,p1 覆盖 0,接在 p2 后边 5. void backpatch(int p,int t)该函数的功能是把 P 所链接的每个四元式的第四区段(result 段)都回填 t。 void backpatch(int p,int t) 软件工程 0801 班 和春辰

12、U200818016 编译技术课程设计11 / 34 int w,circle=p;while(circle) /circle 不为 0 的时候 w=atoi(fourComcircle.result); /四元式 circle 第四分量内容 /strcpy(fourComcircle.result,t); /把 t 填进四元式 circle 的第四分量 sprintf(fourComcircle.result,“%d“,t);circle=w; /w 记录的是链条上下一个四元式,移动! return; 6. void fuzhi()该函数的功能是对赋值语句进行分析。 void fuzhi()

13、 /赋值语句只有 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“); 7. void tiaojian(int *nChain)该函数的功能是对条件语句进行分析。 /-if() void tiaojian(int *nChain) char res10,num110,num210,op10;软件工程 0801 班 和

14、春辰 U200818016 编译技术课程设计12 / 34int nChainTemp;/- 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,“:=do while void xunhuan() char res10,num110,num210,op10; int nCha

15、inTemp;if(syn=8) /do nnc=nextq; /记住 if 语句位置,emit 之后 nextq 就变了 /emit(“0“,“if“,num1,“goto“); scanner();staBlock( /语句块if(syn=9) /while scanner(); if(syn=26) /( scanner(); strcpy(num1,E();if(syn=32) switch(syn)软件工程 0801 班 和春辰 U200818016 编译技术课程设计14 / 34 case 32: strcpy(op,“); break; case 33: strcpy(op,“=“); break; case 34: strcpy(op,“ #include #include #includechar prog80; /存放所有输入字符 char token8; /存放词组 char ch; /单个字符 软件工程 0801 班 和春辰 U200818016 编译技术课程设计19 / 34int syn,p,m,n,i; /syn:种别编码 double sum; int co

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号