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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理课程设计一个简单编译器的设计与分析.docx

1、编译原理课程设计一个简单编译器的设计与分析摘要使用过现代计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。现在计算机系统一般都含有不只一个的高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。高级语言编译程序是计算机系统软件最主要的组成部分之一,也是用户最直接关系的工具之一。计算机上执行一个高级语言程序一般分为两步:第一,用一个编译程序把高级语言翻译成机器语言程序;第二,运行所得的机器语言程序求得计算结果。通常说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序)。如果源语言诸如Fortran,Pascal,C,Ada

2、或java这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序。一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。每个阶段都是从上一个阶段得到结果,对他进行分析,并且根据一些外部环境(例如符号表等)得到最终的输出结果。要构造一个编译程序,可以按照这样的阶段来分别构造,最后来连调。现在人们已经建立了多种编制部分编译程序或整个编译程序的有效工具。有些能用于自动生成扫描器(如LEX),有些可以用于自动产生语法分析器(如YACC),有些甚至可以用来自动产生整个的编译程序。这些构造编译程序的工具

3、成为编译程序编译程序、编译程序产生器或翻译程序书写系统,他们是按照编译程序和目标语言的形式描述而自动产生编译程序的。编译程序是一极其庞大而又复杂的系统,掌握它比较苦难。但是一旦对其掌握,对以后的程序语言设计,系统软件分析,系统软件设计,形式语言研究等方面都是非常有好处的。关键字:C语言、编译、扫描器、语法分析一、需求分析给出类C语言(C语言的子集)的词法和语法定义,并根据对应的语法定义写出一些属性文法和语法制导。根据词法和语法的定义,构造一个编译程序,它主要可以完成如下功能:1、读入某个已经编辑好的类C源程序文件,通过词法分析器,生成二元组,同时检查词法错误;2、语法分析器将产生的二元组作为输

4、入,进行语法分析,同时检查语法错误;3、在语法分析同时,利用属性文法和语法制导技术,产生具体的语意动作,并对符号表进行操作;4、根据语义动作产生整个源程序的四元式序列;5、将产生的四元式序列连同符号表一起输出,作为编译程序的最终输出结果;6、对最后的代码优化和目标代码生成要有所考虑,必须留有一定的接口供以后扩展;7、增大程序的可移植性,努力做到整个系统方便移植。二、详细算法设计词法分析程序 语法分析程序 语义分析程序 编译器。三、流程图图 I 主函数示意图图 II 递归下降分析程序示意图图 III 语句块分析示意图 图 IV 语句串分析示意图 图 V 语句分析示意图四、相关函数说明void s

5、canner(); /扫描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因子char *newTemp(); /自动生成临时变量void backpatch(int

6、 p,int t); /回填int merge(int p1,int p2); /合并p1和p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式五运行结果 图 VI 赋值语句的分析 图 VII 条件语句的分析 图 VIII 循环语句的分析 图 IX 综合六编译器使用说明程序提示用户输入字符串“Please input your source string:”,用户输入字符串并以“#”号结束。回车后,程序显示运行结果。七程序清单#include#include#include#includechar prog80; /* 存放

7、所有输入字符 */char token8; /* 存放词组 */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 index; /* 指数幂 */int isNegative; /* 是否带负号 */double temp; int temp2;in

8、t 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 opera10; char arg210;fourCom20; /* 结构体数组 */void scanner(); /* 扫描 */void lrparser(); void staBlock(int *nCha

9、in); /* 语句块 */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,

10、int t); /* 回填 */int merge(int p1,int p2); /* 合并p1和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(nPlease input your source string:n); doch=getchar(); progp+=ch; while(ch!=#); p=0; isError=0; scanner(); lrpar

11、ser(); 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(); staBlock(&nChain

12、); 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 *nChai

13、n) /* 语句串 */ sta(nChain); 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(

14、int *nChain) char res10,num110,num210,op10; int 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,); break; case 35: strcpy(op,=);

15、 break; case 36: strcpy(op,=); break; case 37: strcpy(op,!=); break; default: 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);

16、/* ntc链接的所有四元式都回填nextq */ if(syn=27) /* ) */ scanner(); staBlock(&nChainTemp); /* 语句块 */ *nChain=merge(nChainTemp,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(); sta

17、Block(&nChainTemp); /* 语句块 */if(syn=9) /* while */ 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,!

18、=); 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() /* 赋值语句只有1个操作数 */ char res10,num10; /* num操作数 */ if(syn=10)

19、 /* 字符串 */ strcpy(res,token); /* 结果 */ scanner(); if(syn=21) /* = */ scanner(); strcpy(num,E(); emit(res,num,=,); else printf(缺少=号n); char* E() /* Expression表达式 */ char *res,*num1,*op,*num2; res=(char *)malloc(10); num1=(char *)malloc(10); op=(char *)malloc(10); num2=(char *)malloc(10); strcpy(num1,

20、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 num1;char* T() /* Term项 */ char *res,*num1,*op,*num2; res=(char *)malloc(10); num1=(char *)malloc(10); op=(char

21、 *)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,num2); strcpy(num1,res); return num1;char* F() /* Factor因子 */ char *res; res=(char *)malloc(10); if

22、(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; return res;char *newTemp() char *p; char varTemp10; p=(char *)malloc(1

23、0); kk+; itoa(kk,varTemp,10); strcpy(p+1,varTemp); p0=T; return p;/* 将p所链接的每个四元式的第四个分量都回填t */void backpatch(int p,int t) int w,circle=p; while(circle) /* circle不为0的时候 */ w=atoi(fourComcircle.result); /* 四元式circle第四分量内容 */ /* strcpy(fourComcircle.result,t); /把t填进四元式circle的第四分量 */ sprintf(fourComcircl

24、e.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(fourComcircle.result,p1); */ sprintf(four

25、Comcircle.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=a)&(ch=A)&(ch=0)&(chtoken */ ch=progp+; /* 读下一个字符 */ tokenm+=0; p-; /* 回退一格 */ syn=10; /* 标识符 */ /* 如果是begin,if,then,while,do,end标识符中的一个 */ for(n=0;n=0)&(ch=0)&(ch=0)&(ch=9) /* pow(x,y)计算x的y次幂 */ temp=(ch-0)*pow

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

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