




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
辽宁师范大学计算机与信息技术学院综合性实验报告课程名称: 编译技术 实验题目:语法制导四元式(算术表达式)生成器 学生姓名: 专业: 计算机科学与技术 学号: 实验日期: 2015.06.05 【实验目的】 1. 理解语法分析器原理、语法制导翻译的过程实质。2. 学会将语法分析所识别的语法成分变换为中间代码形式中的逆波兰记号形式的语义分析方法,编程实现在对一个算术表达式进行语法分析过程的基础上进行语义分析。 【实验内容】 1. 输入算术表达式源语言形式,输出语法分析过程(输入流变化过程)和四元式序列。2. 对于一个给定的算术表达式,首先通过词法分析过程识别出各类语法成分输出至文件中,然后采用预测分析的方法对其进行分析和语法检查,并给出具体的分析过程,包括分析步骤、分析栈、剩余符号以及所用的产生式。在此基础上,向文法中插入语义动作,在语法分析过程中遇到语义动作就做相应的翻译工作,最终将结果(算术表达式的逆波兰式)输出到源文件中。【实验过程】一、判断文法是否为LL(1)文法(1)E-E+E (2)E-E*E (3)E-i|-E由于此文法含左递归,消除左递归,确定算法优先次序,使文法变为:(1)E-TG(2)G-+TG|(3)T-FS(4)S-*FS|(5)F-i|-E1.可推出的非终结符表为:EGTSF否是否是否2.各非终结符的FIRST集合如下:FIRST(E)=(,iFIRST(G)=+, FIRST(T)=(,iFIRST(S)=*, FIRST(F)=(,i3.各非终结符的FOLLOW集合为:FOLLOW(E)=),#FOLLOW(G)=),#FOLLOW(T)=+,),#FOLLOW(S)=+,),#FOLLOW(F)=*,+,),#4.各产生式的SELECT集合为:SELECT(E-TG)=(,iSELECT(G-+TG)=+SELECT(G-)=),#SELECT(T-FS)=(,iSELECT(S-*FS)=*SELECT(S-)=+,),#SELECT(F-E)=(SELECT(F-i)=i5.因为:SELECT(G-+TG)SELECT(G-) = +),# = SELECT(S-*FS)SELECT(S-) = *+,),# = SELECT(F-E)SELECT(F-i) = i( = 所以文法是LL(1)文法。二、构造预测分析表i+*()-#ETGTG-EG+TGTFSFSS*FSFi(E)三、程序开始1.预测试的算术表达式:4+(-4.67e-10)*(-7.89)+5# 分析后:i+(-i)*(-i)+i#写入文件中。边分析边编织逆波兰式,用数组stack1存放。1. 存入9个文法产生式:E-TGE2-EG-+TGG2-T-FSS-*FSS2-F-iF2-(E)2. 存入预测分析表格(如二)3. 利用 终结符数组:vt;非终结符数组:vn;预测分析表table;分析栈stack;等等,对待分析串str2进行分析,并将分许过程存入op.txt中。具体代码如下:#include#include#include#include char str220=0;/存放识别后的字符串“i+(-i)*(-i)+i#”FILE *op;/存储算术表达式的文件“a+(-4.67e-10)*(-7.89)+b#”FILE *fp;/存储分析过程的文件char vt7=i,+,*,(,),-,#; /终结符char vn5=E,G,T,S,F;/非终结符typedef struct type /产生式类型定义char left; /非终结符char right5; /产生式右边字符 type;type E,E1,G,G1,T,S,S1,F,F1;/8个产生式type table77;/预分析表char stack30=0;/分析栈char stack130=0;/存储逆波兰式的int s=-1,st=0;/s-栈顶,st-当前需分析字符void analy1(char str1)/分析=i+(-i)*(-i)+i#int i=0,j=0,p=0,q=0;char s30=0;/辅助堆栈while(str1i!=#)switch(str1i)case a:str2j+=i;stack1q+=a; break;case b:str2j+=i; stack1q+=sp-2; stack1q+=s-p;sp-=0;sp=0; stack1q+=b; break;case +:sp+=+;str2j+=+;break;case *:stack1q+=s-p;sp=0;str2j+=*;sp+=*;break;case (:str2j+=(;break;case ):stack1q+=s-p;sp=0; stack1q+=b; str2j+=);break;case -:sp+=; if(str2j-1=i)break; elsestr2j+=-; break;case .:stack1q+=.;if(str2j-1=i)break;else str2j+=i;break;case 0:stack1q+=0;if(str2j-1=i)break;else str2j+=i;break;case 1:stack1q+=1;if(str2j-1=i)break;else str2j+=i; break;case 2:stack1q+=2;if(str2j-1=i)break; else str2j+=i;break;case 3: stack1q+=3;if(str2j-1=i)break; else str2j+=i; break;case 4: stack1q+=4;if(str2j-1=i)break; else str2j+=i; break;case 5:stack1q+=5;if(str2j-1=i)break; else str2j+=i;break;case 6: stack1q+=6;if(str2j-1=i)break; else str2j+=i; break;case 7:stack1q+=7;if(str2j-1=i)break; else str2j+=i; break;case 8: stack1q+=8;if(str2j-1=i)break; else str2j+=i; break;case 9: stack1q+=9;if(str2j-1=i)break; else str2j+=i; break;case e:stack1q+=s-p;sp=0;if(str2j-1=i) sp+=e; break; else str2j+=i; break;i+;stack1q+=s-p;sp=0;str2j=#;void store()/将8个产生式存入printf(产生式:n);E.left=E;strcpy(E.right,TG);printf(%c-%sn,E.left,E.right);E1.left=E;strcpy(E1.right,-E);printf(%c-%sn,E1.left,E1.right);G.left=G;strcpy(G.right,+TG);printf(%c-%sn,G.left,G.right);G1.left=G;strcpy(G1.right,);printf(%c-%sn,G1.left,G1.right);T.left=T;strcpy(T.right,FS);printf(%c-%sn,T.left,T.right);S.left=S;strcpy(S.right,*FS);printf(%c-%sn,S.left,S.right);S1.left=S;strcpy(S1.right,);printf(%c-%sn,S1.left,S1.right);F.left=F;strcpy(F.right,i);printf(%c-%sn,F.left,F.right);F1.left=F;strcpy(F1.right,(E);printf(%c-%snn,F1.left,F1.right);int length(char a)/求数组长度int i,l=0;for(i=0;i5;i+)if(ai!=0) l+;return l;void tables()/建立分析表int i,j;for(i=0;i=4;i+)/初始化分析表for(j=0;j=6;j+)tableij.left=N;/表内所有left置Ntable05=E1; table00=table03=E; /存入文法table11=G; table14=table16=G1; table20=T; table23=T;table32=S; table31=table34=table36=S1; table40=F; table43=F1;printf(表达式文法的预测分析表:n);printf( t);for(i=0;i7;i+) printf(%ct,vti);printf(n);for(i=0;i5;i+)printf(%ct,vni);for(j=0;j-1; i- )stack+s=tablehl.righti;/产生式逆序入栈if(stacks=)stacks-=0;fputc(tablehl.left,fp);write(-);write(tablehl.right);write(n);void print(int n)/写入文件fprintf(fp,%dtt,n+);/步骤fprintf(fp,%stt,stack);/分析栈fprintf(fp,%stt,str2);/剩余输入串void analy2()int i,j,n=0,finish=0,h,l;char X,a;store();/产生式tables();/预测分析表格write(*分析如下*n);write(步骤tt分析栈tt剩余字符tt所用产生式n);stack+s=#;/#入栈stack+s=E;/E入栈a=str2st;/当前剩余串最左字符while(s-1)X=stacks;/栈顶字符print(+n);for(i=0;i5;i+)if(X=vni)/栈顶为非终结符时E G T S Fh=i;/行号for(j=0;j7;j+)if(a=vtj)l=j;/列号break;if(tablehj.left!=N)/不空时fun(h,l);for(i=0;i7;i+)/栈顶为终结符时i + * ( ) - #if(X=vti)stacks-=0;str2st+= ;a=str2st;/当前剩余串最左字符fputc(X,fp);if(X=#)write(接受n);else write(匹配n);void main()char str1300=0;/预分析算术表达式a+(-4.67e-10)*(-7.89)+b#char h=n;fp=fopen(H:fp.txt,r);fgets(str1,300,fp);/fgets读取一行 fgetc读取一个字符 fread想要的长度fclose(fp);analy1(str1);fp=fopen(H:fp.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课件民族复兴梦
- 火焊操作培训课件
- 培训现场互动
- 课件朗读绿色的梦
- 美术人体结构课件
- 课件显示屏黑色问题
- 广东工程计量自考试题及答案
- 辣椒种植考试题及答案
- 2025年教师招聘之《幼儿教师招聘》模考模拟试题及答案详解【名校卷】
- 多功能机组操作工转正考核试卷及答案
- 社区两委测试卷及答案
- 板房拆除协议书样本
- 行政事务知识培训课件
- 预防出生缺陷健康知识讲座
- 康复专转本试题及答案
- 机械工程图纸会审标准及流程解析
- 院感应知应会习题(含参考答案)
- DBJ50-T-157-2022房屋建筑和市政基础设施工程施工现场从业人员配备标准
- 风险评估技术-危险与可操作性分析(HAZOP)
- 2024年秋季学期新苏科版七年级上册数学课件 2.4 有理数的加法与减法-2.4.1 有理数的加法
- 《串行通讯及其接口》课件
评论
0/150
提交评论