编译基础学习知识原理实验报告3.docx
- 文档编号:3933675
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:21
- 大小:112.76KB
编译基础学习知识原理实验报告3.docx
《编译基础学习知识原理实验报告3.docx》由会员分享,可在线阅读,更多相关《编译基础学习知识原理实验报告3.docx(21页珍藏版)》请在冰豆网上搜索。
编译基础学习知识原理实验报告3
编译原理实验报告
——表达式语法分析
表达式语法分析实验报告
一、实验题目
设计一个简单的表达式语法分析器
(采用递归下降方法设计实现)
二、实验目的
1、了解形式语言基础及其文法运算;
2、熟悉语法分析原理及4种常用的语法分析方法;
其中:
四种算法为
(1)设计算术表达式的递归下降子程序分析算法
(2)设计算术表达式的LL
(1)分析算法
(3)设计算术表达式的简单优先分析算法
(4)设计算术表达式的SLR
(1)分析算法
3、选择上述一种方法并设计一个表达式的语法分析器。
(本实验设计的是递归下降的表达式语法分析器)
三、实验内容
1.设计递归下降语法分析器算法;
2.编写代码并上机调试运行通过;
3、写出试验体会及心得。
四、实验要求
1、给出算术表达式文法
2、进行适当的文法变换
3、选择一种语法分析的方法,并说明其原理
4、根据原理给出相应的算法设计,说明主要的数据结构并画出算法流程图
5、编写代码并上机调试运行通过
6、写出程序运行结果
7、写出相应的文档以及代码注释
8、输入——表达式;
输出——表达式语法是否正确。
五、递归下降的表达式语法分析器设计概要
1.算术表达式文法
G(E):
EE+T|T
TT*F|F
Fi|(E)
2.文法变换:
G’(E):
E->TE'
E'->+TE'|ε
T->FT'
T'->*FT'|ε
F->(E)|I
3.递归下降子程序框图:
六、实验设计源程序
#include
charinputstream[50];//存储输入句子
inttemp=0;//数组下标
intright;//判断输出信息
voide();
voide1();
voidt();
voidt1();
voidf();
voidmain()
{
right=1;
cout<<"请输入您要分析的字符串以#结束(^为空字符):
"< cin>>inputstream; e(); if((inputstream[temp]=='#')&&right) cout<<"分析成功"< else cout<<"分析失败"< } voide() { cout<<"E->TE'"< t(); e1(); } voide1() { if(inputstream[temp]=='+') { cout<<"E'->+TE'"< temp++; t(); e1(); } else if(inputstream[temp]! ='#'||inputstream[temp]! =')') { cout<<"T'->^"< return; } else right=0; } voidt() { cout<<"T->FT'"< f(); t1(); } voidt1() { if(inputstream[temp]=='*') { cout<<"T'->*FT'"< temp++; f(); t1(); } else if(inputstream[temp]! ='#'&&inputstream[temp]! =')'&&inputstream[temp]! ='+') { cout<<"T'->^"< right=0; } } voidf() { if(inputstream[temp]=='i') { cout<<"F->i"< temp++; } else if(inputstream[temp]=='(') { cout<<"F->(E)"< temp++; e(); if(inputstream[temp]==')') { cout<<"F->(E)"< temp++; } else right=0; } elseright=0; } 七、运行结果 八、实验思考题 语法分析的任务是什么? 答: 语法分析器的任务是识别和处理比单词更大的语法单位,如: 程序设计语言中的表达式、各种说明和语句乃至全部源程序,指出其中的语法错误;必要时,可生成内部形式,便于下一阶段处理。 九、实验体会 通过此次实验,让我了解到如何设计、编写并调试语法分析部分的相关程序,并加深对语法分析原理的理解;熟悉了构造语法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。 另外,通过本次实验,也让我重新熟悉了C++语言的相关内容,加深了对C++语言知识的深化和用途的理解。 表达式中间代码生成 一、实验题目 表达式中间代码生成 二、实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 三、实验内容 1.构造算术表达式的四元式翻译文法 2.设计算术表达式的递归下降子程序分析算法 3.设计算术表达的四元式生成算法 4.实现代码并调试运行 四、实验要求 1、采用递归下降语法制导翻译法,对算术表达式,赋值语句进行语义分析并 生成四元式序列. 2、输入是语法分析后提供的正确的单词串,输出四元式序列. 例如: 对于语句串 Begina: =2+3*4;x: =(a+b)/cend# 输出的指令如下: (1)t1=3*4 (2)t2=w+t1 (3)a=t2 (4)t3=a+b (5)t4=t3/c (6)x=t4 五、设计原理 1、原文法: EVA_SENTENCEid: =E EEω0T ET TTω1F TF Fid Fcons F(E) 其中: id——标识符; cons——常数。 2、属性文法G’(E): 产生式语义规则规则编码 EVA_SENTENCEid: =EQUAT(: =); EEω0TQUAT(ω0); (1) E.place: =ti.entry; ETE.place: =T.place TTω1FQUAT(ω1); (1) T.place: =ti.entry; TFT.place: =F.place FidF.place: =id.entry (2) FconsF.place: =cons.entry (2) F(E)F.place: =E.place(3) 其中: (1)QUAT(: =)——生成一个赋值四元式; .(: =,E.place,_,id.entry); .j++; (2)QUAT(ω0)——生成一个运算四元式; .ti: =newt(i);//申请一个临时变量 .(ω0,E.place,T.place,ti.entry); .j++; (3)QUAT(ω1)——类似QUAT(ω0)。 .ti: =newt(i);//申请一个临时变量 .(ω1,T.place,F.place,ti.entry); .j++; 六、程序设计的算法思想 1、设置语义过程 Emit(char*result,char*ag1,char*op,char*ag2) 该函数的功能是生成一个三地址语句送到四元式表达中. 2、四元式表达的结构如下: Struct{ Charresult[8]; Charag1[8]; Charop[8]; Charag2[8]; }quad[20] Char*newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为t1,t2,…. 3、算法设计: 七、实验设计源程序 #include #include #include charprog[80],token[8]; charch; intsyn,p,m,n,sum; intkk=0,ii,N,nn=0; intk=0,t,i=0; chartt; char*rwtab[6]={"begin","if","then","while","do","end"}; intscaner(); intlrparser(); intstatement(); intyucu(); char*term(); char*factor(); char*expression(); voidemit(); struct { charresulted[8]; charag1ed[8]; charoped[8]; charag2ed[8]; }quad[20]; voidmain() { p=0; printf("……………………………………"); printf("\npleaseinputstring: \n"); printf("……………………………………\n"); printf("\n"); printf("……………………………………\n"); do { scanf("%c",&ch); prog[p++]=ch; }while(ch! ='#'); p=0; scaner(); lrparser(); printf("……………………………………\n"); } char*newtemp(void) { char*P; charM[8]; P=(char*)malloc(8); k++; itoa(k,M,10); strcpy(P+1,M); P[0]='t'; return(P); } intlrparser() { intschain=0; kk=0; if(syn==1) { scaner(); schain=yucu(); if(syn=6) { scaner(); if(syn==0&&(kk==0)) printf("success"); } else { if(kk! =1) printf("缺end错误"); kk=1; } } else { printf("begin错误"); kk=1; } return(schain); } intyucu() { intschain=0; schain=statement(); while(syn==26) { scaner(); schain=statement(); } return(schain); } intstatement() { chartt[8],eplace[8]; intschain=0; switch(syn) { case10: strcpy(tt,token); scaner(); if(syn==18) { scaner(); strcpy(eplace,expression()); emit(tt,eplace,"",""); schain=0; } else { printf("缺少赋值号"); kk=1; } return(schain); break; } } char*expression(void) { char*tp,*ep2,*eplace,*tt; tp=(char*)malloc(12); ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,term()); while(syn==13||syn==14) { strcpy(tt,token); scaner(); strcpy(ep2,term()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } return(eplace); } char*term(void) { char*tp,*ep2,*eplace,*tt; tp=(char*)malloc(12); ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,factor()); while(syn==15||syn==16) { strcpy(tt,token); scaner(); strcpy(ep2,factor()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } return(eplace); } char*factor(void) { char*fplace; fplace=(char*)malloc(12); strcpy(fplace,""); if(syn==10) { strcpy(fplace,token); scaner(); } elseif(syn==11) { itoa(sum,fplace,10); scaner(); } elseif(syn==27) { scaner(); strcpy(fplace,expression()); if(syn==28) scaner(); else { printf("')'错误"); kk=1; } } else { printf("'('错误"); kk=1; } return(fplace); } voidemit(char*result,char*ag1,char*op,char*ag2) { strcpy(quad[nn].resulted,result); strcpy(quad[nn].ag1ed,ag1); strcpy(quad[nn].oped,op); strcpy(quad[nn].ag2ed,ag2); printf("(%d)%s=%s%s%s\n",nn+1,quad[nn].resulted,quad[nn].ag1ed,quad[nn].oped,quad[nn].ag2ed); nn++; } scaner() { for(n=0;n<8;n++)token[n]=NULL; ch=prog[p++];m=0; while(ch=='')ch=prog[p++]; if((ch>='a')&&(ch<='z')) {while((ch>='a')&&(ch<='z')||(ch>='0')&&(ch<='9')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) {syn=n+1; break; } } else if(ch>='0'&&ch<='9') {sum=0; while((ch>='0')&&(ch<='9')) {sum=sum*10+(int)ch-'0'; ch=prog[p++]; } p--; syn=11; } else switch(ch) { case'<': m=0;token[m++]=ch; if(ch=='>') {syn=21; token[m++]=ch; } elseif(ch=='=') {syn=22; token[m++]=ch; } else {syn=20; ch=prog[p++]; } break; case'>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') {syn=24; token[m++]=ch; } else {syn=23; p--; break; } break; case': ': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') {syn=18; token[m++]=ch; } else {syn=17; p--; } break; case'+': syn=13;token[0]=ch;break; case'-': syn=14;token[0]=ch;break; case'*': syn=15;token[0]=ch;break; case'/': syn=16;token[0]=ch;break; case'=': syn=25;token[0]=ch;break; case';': syn=26;token[0]=ch;break; case'(': syn=27;token[0]=ch;break; case')': syn=28;token[0]=ch;break; case'#': syn=0;token[0]=ch;break; default: syn=-1; } returnsyn; } 八、运行结果 1、输入错误时的情况: 2、输入正确时的情况: 九、实验体会 通过此次实验,让我了解到如何设计、编写并调试语义分析部分的相关程序,并加深对语义分析原理的理解;熟悉了构造语义分析程序的手工方式的相关原理,使用某种高级语言直接编写此法分析程序。 另外,通过本次实验,也让我重新熟悉了C语言的相关内容,加深了对C语言知识的深化和用途的理解。 通过这次语义分析的实验,我对高级语言的学习有了更深的认识,了解得更透彻。 我了解了高级语言转化为目标代码或汇编指令的过程,。 对今后的学习将起很大的作用,对以后的编程有很大的帮助.本次实验虽然只是完成了一个简单的程序,并且程序的主要框架课本上有给出,但在组织程序结构和深入了确上学到了很多,加深对编译原理的理解,掌握编译程序的实现方法和技术。 巩固了前面所学的知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 基础 学习 知识 原理 实验 报告