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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(语法制导四元式算术表达式生成器.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

语法制导四元式算术表达式生成器.docx

1、语法制导四元式算术表达式生成器辽宁师范大学计算机与信息技术学院综合性实验报告课程名称: 编译技术 实验题目:语法制导四元式(算术表达式)生成器 学生姓名: 专业: 计算机科学与技术 学号: 实验日期: 01.060 【实验目的】 1.理解语法分析器原理、语法制导翻译的过程实质。2.学会将语法分析所识别的语法成分变换为中间代码形式中的逆波兰记号形式的语义分析方法,编程实现在对一个算术表达式进行语法分析过程的基础上进行语义分析。 【实验内容】 1.输入算术表达式源语言形式,输出语法分析过程(输入流变化过程)和四元式序列。2.对于一个给定的算术表达式,首先通过词法分析过程识别出各类语法成分输出至文件

2、中,然后采用预测分析的方法对其进行分析和语法检查,并给出具体的分析过程,包括分析步骤、分析栈、剩余符号以及所用的产生式。在此基础上,向文法中插入语义动作,在语法分析过程中遇到语义动作就做相应的翻译工作,最终将结果(算术表达式的逆波兰式)输出到源文件中。【实验过程】一、判断文法是否为LL(1)文法(1)E ()EE*E (3)E-i|E由于此文法含左递归,消除左递归,确定算法优先次序,使文法变为:(1)E-TG()G-+TG(3)T-FS(4)S-*FS|(5)F-i|E1.可推出的非终结符表为:GTSF否是否是否2.各非终结符的FRST集合如下: FIRST()=(,iIRST()=+, IR

3、T(T)(,i FIRS(S)=*,FIRST()=(,3.各非终结符的FOLO集合为:FOLOW(E)=),#FLLW(G)=),FOLLO()=+,),OLOW(S)=+,), FOLLOW(F)=*,+,),#4各产生式的SELECT集合为:SELEC(E-TG)=(,i SCT(G-+TG)=+SELECT(G)=),SEECT(TFS)=(,iSELC(-*F)=* ELET(S-)=+,),#SELECT(F-E)=( SLECT(F-i)=i5.因为: SELEC(-+T)SLECT(G-) +), = SELECT(S-*S)LECT(S-) ,),= SELECT(F-E)S

4、LEC(-) = ( = 所以文法是LL(1)文法。 二、构造预测分析表i+*()-#EGTGEG+TGTSFSS*Fi(E)三、程序开始 1.预测试的算术表达式:4+(-4.e-10)(-789)+5 分析后:i+(-i)(-i)+i# 写入文件中。 边分析边编织逆波兰式,用数组sack1存放。1.存入个文法产生式:-TGEEG-+GGT-SS-*SS-i2-(E)2.存入预测分析表格(如二)3.利用终结符数组:v;非终结符数组:vn;预测分析表tabe;分析栈stack;等等,对待分析串tr进行分析,并将分许过程存入opxt中。具体代码如下:#include#ncludmalloc.h#i

5、lude#incluecar sr20=;/存放识别后的字符串“+(i)*(-i)+i#”ILE *op; /存储算术表达式的文件“a+(-467e0)*(-7.9)+#”FIE *p; /存储分析过程的文件cha v7=i,+,*,(,),-,#; /终结符charv=,G,T,; /非终结符typede struct type /产生式类型定义a lft; /非终结符cha rih; /产生式右边字符 type;typ E,G,T,S1,F1; /8个产生式ype tal77; /预分析表charsack30; /分析栈ca tac130=0; /存储逆波兰式的its=,s=0; /-栈顶

6、,t-当前需分析字符oi aal(char str1)/分析=i+(-i)*(-)i#inti=,j=,p0,q=0; chr s300; /辅助堆栈 hile(st1i!=) sitch(1i) cas a:st2j+=;stacq+=;break; case b:str2j+=i; stck1q+=sp-2; stack1q+s-p;sp-=;sp0; stck1=b; reak; case+:s+=;trj+;break; cas *:stack+-p; sp=0; r2j+*; sp+=; brea; cs (:srj+=(;bek; ase):stck1+=s-;p; stack1q

7、+=b; str2j+);bea; case-:s+=; if(tr2j-1=i)reak; esesr2j+=-; beak; cas.:stak1q+=.; if(r2j-=i)break; elsestr2j+i; brea; cas :stck1q+=0; f(str2j-1i)beak; elesrj+=; brak; cas :stack1+=1; f(strj-i)break; ese str2+=i; beak; cs 2:c1q+2; f(str2-1=i)bak;esest2j+=; rak; cae 3: tk1q+=3; if(st2j1=i)rek; else str

8、2+i; eak; cas 4: sack+=4; f(t2j-1=i)brak; ele st2+i; break; cae :stck1q+=5; if(str2j-1=)break; ele st2j+=i; break; ase 6: stck1q+=; if(strj1=)reak; ese st2+=; break; ce 7:sack1q+=7; (strj=i)brek; el sr2j+=i; be; cae 8: sak1q8; if(r-=i)brak; s r2j+=; beak; case :stack1q+9; if(trj-=i)brea; ese t2j+=i;

9、 bra; ce :ck1+=s-;sp=0; if(st-1=i) s+=e; bra; else t2+i; eak; i+;ak1q+s-p;=0;str2j=;void store()/将8个产生式存入 print(产生式:n); E.left=E; strcy(.rght,TG);print(%c%sn,Elft,E.righ); E1.le=E; strcpy(E1.rit,-E);pintf(sn,E1.left,1.ht);G.left=G;sry(G.right,+T);rintf(%c-%n,G.le,G.right);G1.lft=G;strcpy(G1.ight,);p

10、rif(%c-%sn,.et,G1.right); T.left; strp(T.ght,FS); rtf(c-%sn,Tleft,T.right);S.lft=S; strpy(Srght,*FS);prn(%csn,S.ft,S.right); S.left=;str(S1.igt,);ptf(%c-sn,S1.eft,1.rht); F.left=F;strpy(F.ri,i); printf(c-%sn,F.lef,F.rht);F1.lft; trcp(F.riht,(); print(%nn,F.lft,F1.rit);nt lengh(chaa)/求数组长度 int ,l0;fo

11、r(=;5;)if(i!0)l+;eurn l;void ables() /建立分析表 ini,j; for(0;i=;i+)/初始化分析表fo(j=0;j6;+) taeijlt=;/表内所有lt置N tbe05E1; able00=tbl03=; /存入文法tabl1; table1=abl16=G1; table2T; be23T;tal32=S; able31=tb34=tle36=S; tl40=F; a43=F1; print(表达式文法的预测分析表:n); pntf(); or(0;i7;i+)pritf(%ct,i); pri(n); for(i=0;i5;+)pinf(%ct

12、,vni); fr(=0;j); rite(tblhl.rigt); wite();void print(int ) /写入文件fprintf(fp,%dtt,); /步骤 rint(f,%st,tac); /分析栈 print(p,st,str);/剩余输入串void analy2()int i,j,n=,fnsh,l;crX,;to(); /产生式tables(); /预测分析表格 ite(*分析如下*n); wi(步骤tt分析栈t剩余字符tt所用产生式n); stack+s=; /入栈 stck+s=; /入栈a=srt; /当前剩余串最左字符 whl(-1) X=stacks; /栈顶

13、字符 pt(+); for(i=;i5;i) f(X=vni) /栈顶为非终结符时ET S h=; /行号 for(j=0;j7;j+) f(a=vtj) =j;/列号 break; f(ablehjft!=N) /不空时 fun(h,l); for(i=0;7;i+) /栈顶为终结符时i+ *( ) - # if(X=vi) stacks-0; str2s= ; a=st2t; /当前剩余串最左字符 putc(X,f); if(X=#)write(接受n); else wr(匹配n); voi ain()cr str1300;/预分析算术表达式a+(-4.7e-0)(-789)+# har

14、hn; fp=open(H:.txt,r);gts(str1,0,fp); /fgets读取一行 fgetc读取一个字符 frad想要的长度 fcls();aay(sr1);p=foen(:p.txt,a); /不会覆盖原数据frie(,szeof(),1,fp); /换行fwrite(tak1,sizof(sack1),1,p); /写入逆波兰式fclose();pif(分析得到的符号串:%snn,str2); op=fopen(H:op.x,w); fputs(str2,fp); /写入i+(-i)*(-)+i#wrt();aly2(); fclos(op);四、运行结果截屏:源文件:屏幕输出:分析过程:运行后的源文件:【实验结果分析】

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2