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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理课程设计小型程序设计语言编译器的设计与实现文档格式.docx

1、所以就选择参照书上的内容自己动手,词法分析的思路基本上和书上的一样对每个词进行分析编号。但是由于书上内容复杂,所以我只做了赋值语句的顺序处理部分。而且和书上的赋值语句相比我有加了减法和除法的功能。并且在读取阶段,书上是按行读取(读到”n”为一个readline),而我选择了按语句进行读取(读到”;”为一个readline)。因为有时候一行之间会有好几个语句。我可以把一行上的多个语句分开来,当然书上也可以只不过这一步她是在程序语句处理里面完成的。而我只有赋值语句。并且还要实现顺序结构所以就按照自己的思路做下去了。 然后是语法分析,由于词法分析和书上的有出路。所以一开始我就没打算用书上的思路去做。

2、就按照自己的思路来解决,首先是对词法分析里的存储单词的数组进行拷贝和修改(添加了#号使其能区分出赋值语句)、然后正式的语法分析时,我是直接对拷贝后的数组进行分析的,中间出了不少错误,更关键的是语法分析时在顺序上出现了错误,这一点我无法用语言说清楚,解决顺序上的错误时我加入了add1()这个函数,同时这个函数也实现了将终结符改为非终结符的功能(也就是所谓的临时变量)。然后就是一个语句分析完后进行下一个语句的分析。这个就是个衔接问题,改动数组的坐标就能完成,大概的思路就是这样,中间调试时错误百出,对语法分析程序做了不少的小动作。然后就是将语法分析结果显示出来,为了和课本的相似,用了几个条件语句做约

3、定。这个是第二天上午解决的,思考了一会。当然最关键的核心技术,还是和书上的一样。符号种别编码说明Pound_sign7“#”add34“+”sub35“-”mul36“*“div37“/”equal38“=”lbrackets48“(“rbrackets49“)”tempsy55临时变量ident56变量intconst57整常数单词符号的内部定状态ACTIONGOTOi+-*/()#ES3S2S4S5S6S78R69101112S13R1R2R3R413R5算符运算SLR(1)分析表七源程序及运行结果#includefstreamstring.husing namespace std;#de

4、fine txtname C:bianyiqi.txt#define ACC -2/-字符定义-#define pound_sign 7 /“#”#define add 34 /“+”#define sub 35 /“-”#define mul 36 /“*“#define div 37 /“/”#define equal 38 /“=”#define lbrackets 48 /“(“#define rbrackets 49 /“)”#define tempsy 55 /临时变量#define ident 56 /变量#define intconst 57 /整常数/-变量申明-char c

5、h=0; /读取字符int count=0; /计buf里的单词个数static char spelling10=; /读取一个变量static char line255= /单词字符数组char *pline; /单词指针int lnum=0; /行数int nlength=0; /所产生的变量编号static char ntab110010; /存放新的变量并进行比较struct aa int sy1; int pos;buf1000,n,n1,E,sstack100,ibuf100;int tt1=0;int stack1000; /栈int sp=0; /栈的位置数int ii=2;

6、/ibuf数组的位置数int lr; /状态序列int j=0; /ibuf总个数int h=1; /控制”#结束#”的个数函数ifstream infile;/-语法分析表-int action149=3,-1,-1,-1,-1,2,-1,-1,1, -1,4,5,6,7,-1,-1,ACC,-1, 3,-1,-1,-1,-1,2,-1,-1,8, -1,106,106,106,106,-1,106,106,-1, 3,-1,-1,-1,-1,2,-1,-1,9, 3,-1,-1,-1,-1,2,-1,-1,10, 3,-1,-1,-1,-1,2,-1,-1,11, 3,-1,-1,-1,-

7、1,2,-1,-1,12, -1,4,5,6,7,-1,13,-1,-1, -1,101,101,6,7,-1,101,101,-1, -1,102,102,6,7,-1,102,102,-1, -1,103,103,103,103,-1,103,103,-1, -1,104,104,104,104,-1,104,104,-1, -1,105,105,105,105,-1,105,105,-1;/-字符读取-void readline() char ch1; pline=line; infile.get(ch1); while(ch1!= *pline=ch1; pline+; infile.

8、get(ch1); *pline=NULL;void readch() if(ch=NULL) readline(); lnum+; ch=*pline; pline+;/-变量识别-int find(char spel) int ss1=0; int ii=0; while(ss1=0)&(iia)&(ch09); pline-; spellingk= bufcount.sy1=ident; j=find(spelling); if(j=-1) bufcount.pos=tt1; strcpy(ntab1tt1,spelling); tt1+; nlength+; bufcount.pos=

9、j; count+; for(k=0;k); bufcount.sy1=intconst; bufcount.pos=ivalue;/-词法分析-void scan() while(ch! switch(ch) case :break;bcdefghijklmnopqrstuvwxyidentifier(); break;12345678number();+bufcount.sy1=add; count+;-bufcount.sy1=sub;*bufcount.sy1=mul;/bufcount.sy1=div;bufcount.sy1=equal;(bufcount.sy1=lbracket

10、s;)bufcount.sy1=rbrackets; bufcount.sy1=-1; /全部读完最后一个赋值为-1/-void disp2(aa k) switch(k.sy1) case 34:cout+endl; case 35:- case 36:* case 37:/ case 38:= case 48:( case 49:) case 55:临时变量 case 56:变量tntab1k.pos case 57:整常数void disp1() int i; coutendl-词法分析结果- for(i=0;icount;i+) coutbufi.sy1bufi.pos disp2(b

11、ufi);程序总共lnum行,产生了count个二元式-变量名表-tt1;ntab1ivoid disp3()状态: for(int i=0;=sp;stacki /-与分析表匹配-int change(int n) switch(n) case ident: case intconst:return 0; case add:return 1; case sub:return 2; case mul:return 3; case div:return 4; case lbrackets:return 5; case rbrackets:return 6; case pound_sign:ret

12、urn 7; case tempsy:return 8;/-词法分析数组转化为语法分析数组-void exchange() if(bufi-1.sy1=ident&bufi.sy1=ident) ibufj.sy1=pound_sign; j+; ibufj.sy1=bufi.sy1; if(bufi.sy1=ident) ibufj.pos=bufi.pos; j+; ibufj.sy1=pound_sign; j+; ibufj.sy1=-1;=j;ibufi.sy1=i;n-) ibufn+1.sy1=ibufn.sy1; ibufn+1.sy1=tempsy;/-语法分析-void l

13、rparse() lr=actionstackspchange(ibufii.sy1);/ coutstackspchange(ibufii.sy1) if(ibufii.sy1!=tempsy) disp3(); if(lr=0) sp+; stacksp=lr; if(ibufii.sy1!=tempsy&lr!=ACC) cout移进/ cout#ibufii.sy1100&lr107) switch(lr) case 101:sp=sp-3; add1(ii); ibufii.sy1=tempsy;归约EE+E break; case 102:归约EE-E case 103:归约EE*

14、E case 104:归约EE/E case 105:归约E(E) case 106:sp=sp-1;归约Ei if(lr=ACC) sp=sp-1; if(h=1)/ disp3();#结束 h=2; if(ibufii+1.sy1!=-1) stacksp+1=0; ii=ii+3; h=1; lrparse(); else return;/-int main() infile.open(txtname,ios:in); readch(); scan(); disp1(); exchange(); stacksp=0;-语法分析- lrparse(); infile.close(); return 0;运行结果:1.使用的语句是d=(a+b)/c;这里的 号是用来结束用的实际分析的

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

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