版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息科学与工程学院课程设计任务书题目一个简单编译器的设计与分析姓 名:学 号:专业班级:课 程: 编译原理指导教师:职称:讲师完成时间:2011 年 12 月-2011 年 12 月枣庄学院信息科学与工程学院制2011年12月20日课程设计任务书及成绩评定课程设计的任务和具体要求在理解编译原理相关理论的基础上, 要求用C或C+语言描述及上机调试, 实现一个小编译器(包括符号表的构造,词法分析,语法分析,语义分析,目 标代码生成等重要子程序,其中词法分析、语法分析及语义分析功能必须完成) 使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从 而提高学生软件开发的能力。指导教师签字
2、:_日期:指导教师评语成绩: 指导教师签字: 日期: 课程设计所需软件、硬件等硬件环境:Win dowsXP/Wi n7操作系统软件环境:Microsoft visual C+6.0课程设计进度计划起至日期工作容备注2011-12-01 052011-12-06 102011-12-11 16查找资料理清思路,编写程序完善程序,编辑文档参考文献、资料索引序号文献、资料名称编著者出版单位【1】 程序设计语言编译原理火旺 春林国防工业【2】数据结构严蔚敏清华大学【3】C+程序设计吴乃林况迎辉高等教育【4】C语言程序设计谭浩强清华大学【5】 程序设计语言编译原理火旺、春林等 国防工业目录一、 摘要
3、错误!未定义书签。二、 总体设计方案及主要设计原理 错误!未定义书签。1、 单词符号及种别表 错误!未定义书签。2、 语法结构定义 错误!未定义书签。3、 主要算法 错误!未定义书签。(1) 词法分析主要算法 错误!未定义书签。(2) 语法分析主要思想 错误!未定义书签。(3) 语义分析主要算法 错误!未定义书签。三、 源程序代码 错误!未定义书签。四、 测试及分析 错误!未定义书签。五、 心得体会 错误!未定义书签。一、摘要编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、 语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是 相对独立的,它一方面从上一个阶段获取分析的
4、结果来进行分析,另一方 面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统 的结构。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个 一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、 常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语 法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针 对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可 以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的 语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分 析,并产生一定的语义动作,来生成中间代码
5、。上面三个过程可以与硬件 无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。 代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代 码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编 语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都 是非常重要的环节。F图给出了编译系统的结构框图词法分析器单词符号语法分析器语法单元语义分析与中间代码生成器优化器中间代码1中间代码目标代码生成器目标代码二、总体设计方案及主要设计原理2.1、单词符号及种别表示单词符号种别编码单词值mai n1int2float3double4char5if6else7do8w
6、hile9l(l|d)*10部字符串(+|-|£ ) d*(.dd* |£ )( e ( +|-|£ )dd*| £ )20二进制数值表示=21+22-23*24/25(26)27282930y31>32> =33<34<=35=36!=372.2、语法结构定义程序 :=mai n()v 语句块语句块 := 语句串''/程序用括号括起来语句串 := 语句;语句;语句 := 赋值语句|条件语句|循环语句赋值语句:=ID=表达式 /赋值语句用”=”号条件语句:=if条件语句块 /条件怎么没有括号,囧(自己加1 个)循环
7、语句:=do 语句块while 条件条件 := 表达式 关系运算符 表达式表达式 := 项 +项|-项项 := 因子*因子|/因子 因子 :=ID| nu m|( 表达式 )num:= ( +|-|£ )数字*(.数字数字* | c )( e ( +卜|£ )数字数字*| c )ID:=字母(字母|d数字)*字母:=a|b|c |z|A|B|C |Z数字:=0|1|2 |9关系运算符 :=|=|=|=|!=2.3、主要算法、词法分析主要算法这部分对源文件进行分析,允许/* */注释。从源文件依次读取字符,对字符进行分析,组成字符串、数字、关系符等固定含义的token 符,并
8、把它们添加到token链中,如果遇到非法字符报错并退出程序。232、语法分析主要思想这部分对Token链进行分析,利用自底向上的分析方法,构建SLR(1)分析表的过程是手工完成的。语法分析的同时构建语法树,移进 时创建叶子,规约时创建节点。、语义分析主要分析这部分对语法树从左到右进行遍历,节点记录了规约式的编号,遍历到节 点时就进行相应处理。语义分析主要检查变量、函数是否被定义或重定义,同 时产生四元式。三、源程序代码#i nclude<stdio.h> #i ncludevstri ng.h> #in clude<math.h> #i nclude<std
9、lib.h>char prog80; /存放所有输入字符char toke n 8; /存放词组char ch; / 单个字符int syn ,p, m,n ,i; syn:种别编码double sum;int count;int isSignal; /是否带正负号(0不带,1负号,2正号)int isError;int isDecimal; /是否是小数double decimal; / 小数 int isExp; /是否是指数int in dex; /指数幕int isNegative; / 是否带负号是否连续出现+,-double temp; int temp2; int repe
10、at; / int n extq;int kk; /临时变量的标号int ntc,nfc,nnc,nnb,nna;char *rwtab9="ma in ","i nt","float","double","char","if","else","do","wh ile"structchar result10; / 字符串(字符数组)char arg110;char opera10;char arg210;fourCo
11、m20; /结构体数组void sca nn er(); /扫描void lrparser();void staBlock( int *n Chai n); /语句块void staStri ng(int *n Chai n); /语句串void sta(i nt *n Chai n); /语句void fuzhi(); /赋值语句void tiaojia n(int *n Chai n); /条件语句void xun hua n(); /循环语句char* E(); /Expresiio n表达式char* T(); /Term 项char* F(); /Factor 因子char *n e
12、wTemp(); /自动生成临时变量void backpatch(i nt p,i nt t); /回填int merge(int p1,int p2); /合并 p1 和 p2void emit(char *res,char *nu m1,char *op,char *nu m2); /生成四元式void mai n()p=0;coun t=0;isDecimal=0;in dex=0;repeat=0;kk=0;prin tf("nPlease in put your source stri ng:n");doch=getchar(); progp+=ch;while(
13、ch!=#);p=0;isError=0;sca nn er();lrparser();for(i=1;i< nextq;i+) /循环输出四元式prin tf("n%dt",i);prin tf("(%5s%5s%5st%5s )n",fourComi.arg1,fourComi.opera,fourComi.arg2,fourCo mi.result);void lrparser()int n Cha in;nfc=n tc=1;n extq=1;if(syn=1) mai nsca nn er();if(sy n=26) /(sca nn e
14、r();if(sy n=27) /)sca nn er();staBlock(&n Chai n);elseprintf("缺少右括号n");elseprintf("缺少左括号n"); elseprintf("缺少 mainn");/语句块 :='' 语句串''void staBlock(i nt *n Chai n) /语句块if(sy n=28) /sca nn er();staStri ng(n Cha in);backpatch(* nCha in,n extq);if(sy n=29)
15、 /sca nn er(); / 读下一个elseprintf("缺少号 n"); elseprin tf("缺少号n");/语句串 := 语句;语句;void staStri ng(i nt *n Chai n) /语句串sta( nChai n);backpatch(* nCha in,n extq);while(sy n=31) /;sca nn er(); sta( nChai n);/backpatch(* nChai n,n extq-1);void sta( int *n Chai n) /语句if(sy n=10)fuzhi();/*n
16、Chai n=0;else if(syn=6) /iftiaojian(n Cha in);else if(syn=8) /doxun hua n();/条件语句-if(条件 ) 语句块void tiaojia n(i nt *n Cha in)char res10, num110, num210,op10; int n Cha in Temp;/条件 -表达式 关系运算符表达式if(sy n=6) /ifsca nn er();strcpy( nu m1,E();if(sy n=26) /(sca nn er();strcpy( nu m1,E();if(sy n<=37)&&
17、amp;(sy n>=32)switch(s yn)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:pri
18、n tf("error");sca nn er(); strcpy( nu m2,E();strcat( nu m1,op); strcat( nu m1, nu m2);nfc=n extq+1;ntc= nextq; /记住if语句位置emit("O","if", num1,"goto");nfc=n extq; /if中表达式为假emit("0","","","goto");/第一个0已回填backpatch(ntc,nextq)
19、; ntc的所有四元式都回填 nextqif(syn=27) /)sca nn er();staBlock(&n Chai nTemp); /语句块*n Chai n=merge( nChai nTemp, nfc);/循环语句:=do 语句块while 条件void xun hua n()char res10, num110, num210,op10;int n Cha in Temp;if(syn=8) /donnc=nextq; / 记住if 语句位置,emit之后 nextq 就变了emit("0","if", num1,"go
20、to");sca nn er();staBlock(&n Chai nTemp); /语句块if(syn=9) /whilesca nn er();if(sy n=26) /(sca nn er();strcpy( nu m1,E();if(sy n=37)&&(sy n=32)switch(s yn)case 32:strcpy(op,"");break;case 33:strcpy(op,"=");break;case 34: strcpy(op,"<"); break;case 35: s
21、trcpy(op,"<="); break;case 36: strcpy(op,"="); break;case 37: strcpy(op,"!="); break;default:prin tf("error");sca nn er(); strcpy( nu m2,E();strcat( nu m1,op); strcat( nu m1, nu m2);nnb=n extq;emit("O","if", num1,"goto"); backp
22、atch( nnb,nn c);nna=n extq;emit("0","","","goto"); backpatch( nna,n extq);if(syn=27) /)sca nn er();void fuzhi() /赋值语句只有1个操作数char res10, nu m10; /num操作数if(sy n=10)/字符串strcpy(res,toke n); / 结果sea nn er();if(sy n=21)/1=sea nn er();strepy( nu m,E(); emit(res ,nu m
23、,"=",""); elseprin tf("缺少=号 n");char* E() /Expressi on表达式char *res,* nu m1,*op,* nu m2; res=(char *)malloc(10);nu m1=(char *)malloc(10); op=(char *)malloc(10); num2=(char *)malloc(10);strcpy( nu m1,T(); while(s yn=22)|(sy n=23) /+ -if(sy n=22) /+ strcpy(op,"+"
24、);elsestrcpy(op,"-"); sca nn er();strcpy( nu m2,T(); strcpy(res ,n ewTemp(); emit(res ,nu m1,op, nu m2);strcpy( nu m1,res); return nu m1;char* T() /Term 项char *res,* nu m1,*op,* nu m2; res=(char *)malloc(10);nu m1=(char *)malloc(10); op=(char *)malloc(10);nu m2=(char *)malloc(10);strcpy( n
25、u m1,F(); while(syn=24)|(syn=25) /* / if(sy n=24) strcpy(op,"*");elsestrcpy(op,"/");sca nn er();strcpy( nu m2,F(); strcpy(res ,n ewTemp(); emit(res ,nu m1,op, nu m2); strcpy( nu m1,res);return nu m1;char* F() /Factor 因子char *res;res=(char *)malloc(10); if(sy n=10)/ 字符串 strcpy(res
26、,toke n);sca nn er();else if(sy n=20) /二进制数itoa(i nt)sum,res,10); /整数转换为字符串sca nn er();else if(sy n=26) /(sca nn er(); res=E(); if(sy n=27) /) sca nn er();else isError=1;elseisError=1;return res;Lchar *n ewTemp()char *p;char varTemp10;p=(char *)malloc(10);kk+;itoa(kk,varTemp,10); strcpy(p+1,varTemp)
27、;p0='T'return p;/将p所的每个四元式的第四个分量都回填tvoid backpatch(i nt p,i nt t)int w,circle=p;while(circle) /circle不为 0 的时候w=atoi(fourComcircle.result); /四元式 circle第四分量容strcpy(fourComcircle.result,t); /把 t 填进四元式 circle 的第四分量spri ntf(fourComcircle.result,"%d",t);circle=w; /w 记录的是链条上下一个四元式,移动!retu
28、rn;int merge(int p1,int p2) /合并 p1 和 p2char circle ,n Result;if(p2=0)n Result=p1;elsen Result=circle=p2;while(atoi(fourComcircle.result) /四元式第四个分量不为 0circle=atoi(fourComcircle.result); strcpy(fourComcircle.result,p1); spri ntf(fourComcircle.result,"%s",p1);/目的是用p1的值覆盖0kreturn nResult; p2是头
29、,pl覆盖0,接在p2后边void emit(char *res,char *nu m1,char *op,char *nu m2)strcpy(fourCom nextq.result,res);strcpy(fourCom nextq.arg1, nu m1);strcpy(fourCom nextq.opera,op);strcpy(fourCom nextq.arg2, nu m2);n extq+;void sca nner()sum=0;decimal=0;m=0;for(n=0;n<8;n+)toke nn =NULL;ch=progp+; / 从prog中读出一个字符到c
30、h中 while(ch=' '|ch='n') /跳过空字符(无效输入)ch=progp+;if(ch>='a')&&( ch<='z')|(ch>='A')&&(ch<='Z') ch是字母字符while(ch>='a')&&(ch<='z')|(ch>='A')&&( ch<='Z')|(ch>='0'
31、;)&&(c h<='9')toke n m+=ch; /ch=>toke nch=progp+; /读下一个字符toke nm+='0'p-; /回退一格syn=10; / 标识符/ 如果是"begi n","if","the n","while","do","e nd"标识符中的一个for(n=0;n<9;n+)if(strcmp(toke n, rwtab n)=0)syn=n+1;break;else
32、if(ch>='0')&&(ch<=9)IsNum:if(isSig nal=1)/toke nm+='-'while(ch>='0')&&( ch<='9')sum=sum*10+ch-'0' /ch中数字本身是当做字符存放的ch=progp+;if(ch='.')isDecimal=1; ch=progp+;count=0; /之前忘了清零,123.123+123.123#两个浮点数就无法识 别while(ch>='0'
33、; )&&(ch<='9')pow(x,y)计算x的y次幕temp=(ch-'0')*pow(0.1,+cou nt); decimal=decimal+temp;AddToDec(); ch=progp+; sum=sum+decimal;if(ch='e'|ch='E')isExp=1; ch=progp+;if(ch='-')isNegative=1; ch=progp+; while(ch>='0' )&&(ch<='9')/
34、指数in dex=i ndex*1O+ch-'O' ch=progp+;10的幕123e3代表 123*10 (3)sum=sum*pow(10,i ndex);是错误的if(isNegative)sum=sum*pow(0.1,i ndex);elsesum=sum*pow(10,i ndex);if(isSig nal=1)sum=-sum;isSig nal=0;p-;sy n=20;else switch(ch)case '<':m=0;toke n m+=ch;ch=progp+;if(ch='=')syn=35;toke n m
35、+=ch;elsesyn=34;p-;break;case '>':m=0;toke n m+=ch;ch=progp+;if(ch='=')syn=33;toke n m+=ch;elsesyn=32;P-;break;case '=':m=0;toke n m+=ch;ch=progp+;if(ch='=')syn=36;toke n m+=ch;elsesyn=21;P-;break;case '+':temp2=progp;toke n m+=ch;if(temp2>='0')&&(temp2<='9')&&(repeat=1)isSig nal=2; ch=progp+;repeat=0;goto IsNum;if(temp2='+')|(temp2='-')&&( repeat=0) /如果重复出现符号,才将后边的+,-视为正负号repeat=1; ch=progp+; sy n=22;break;case '-':temp2=progp;toke n m+=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《入学教育》课件
- 浙江省嘉兴市2024-2025学年高二数学上学期期末测试试题
- 浙江省温州2024-2025高一生物上学期期末考试试题A卷
- 湖南省部分学校2024-2025学年高三数学上学期12月联考试题
- 2024幼儿园家庭教育工作计划范文
- 四年级数学教师教学工作计划
- 2024初三语文老师工作计划
- 统考版2025版高考语文一轮复习微专题小练习第42练语言表达+名句默写+论述类文本阅读
- 2024年仓库工作人员个人工作计划范文
- 老高考旧教材适用2025版高考地理二轮复习热考情境专项练1太阳方位与影子
- 小学生学业成绩等级制度-小学学业等级
- 过程审核VDA6.3检查表
- 常压矩形容器设计计算软件
- 交流变换为直流的稳定电源设计方案
- PR6C系列数控液压板料折弯机 使用说明书
- 装配工艺通用要求
- 钢结构工程环境保护和文明施工措施
- 物业管理业主意见征询表
- 8D培训课件 (ppt 43页)
- 劳动力计划表
- 《教育改革发展纲要》义务教育阶段解读
评论
0/150
提交评论