2022年编译原理预测分析法C语言实验报告

上传人:151****513 文档编号:245974954 上传时间:2022-01-26 格式:DOCX 页数:12 大小:9.47KB
返回 下载 相关 举报
2022年编译原理预测分析法C语言实验报告_第1页
第1页 / 共12页
2022年编译原理预测分析法C语言实验报告_第2页
第2页 / 共12页
2022年编译原理预测分析法C语言实验报告_第3页
第3页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《2022年编译原理预测分析法C语言实验报告》由会员分享,可在线阅读,更多相关《2022年编译原理预测分析法C语言实验报告(12页珍藏版)》请在金锄头文库上搜索。

1、精选word文档 下载可编辑题目:编写识别由下列文法所定义的表达式的预测分析程序。EE+T | E-T | TTT*F | T F |FF(E) | i输入:每行含一个表达式的文本文件。输出:分析成功或不成功信息。(题目来源:编译原理实验(三)-预测(LL(1)分析法的实现)?解答:?(1)分析a) E=E+T=E+T*F=E+T*(E)即有E=E+T*(E)存在左递归。用直接改写法消除左递归,得到如下:E TE E +TE | ?TE|T FT T *FT | FT|F (E) | i对于以上改进的方法。可得:对于E:?FIRST( E )=FIRST(+TE)FIRST(-TE)=+,?,

2、对于T:FIRST( T )=FIRST(*FT)FIRST( FT)=*,而且:FIRST( E )=FIRST( T )=FIRST( F )=FIRST(E)FIRST(i)=(,i 由此我们容易得出各非终结符的FOLLOW集合如下:FOLLOW( E )= ),#FOLLOW(E)=FOLLOW(E)= ),#FOLLOW( T )=FIRST(E)FOLLOW(E)=+,?,),#FOLLOW( T )=FOLLOW( T )=+,?,),#FOLLOW( F )=FIRST(T)FOLLOW(T)=*,+,?,),#由以上FOLLOW集可以我们可以得出SELECT集如下:对ESEL

3、ECT(ETE)=FIRST(TE)=FIRST(T)= (,i 对E SELECT(E +TE)= + SELECT(E ?TE)= ? SELECT(E )=,),#对TSELECT(TFT)=(,i对T SELECT(T *FT)= * SELECT(T FT)= SELECT(T )=,+,?,),#对FSELECT(F(E) )= ( SELECT(Fi)= i SELECT(E +TE)SELECT(E ?TE)SELECT(E )=FSELECT(T *FT)SELECT(T FT)SELECT(T )=FSELECT(F(E) )SELECT(Fi)=F由上可知,有相同左部产生

4、式的SELECT集合的交集为空,所以文法是LL(1)文法。?b) 由Select集构造文法LL(1)的预测分析表 (表1)非终结符终结符i+-* ()#EE TE0E-TE5EE- + T E11E- - TE12E-16E-17E-18TT-FT20T-FT25TT-31T-32T-*FT33T- FT34T-36T-37T-38FF-i40F-(E)45表1. LL(1)预测分析表?(2)设计算法的主要流程图(如:图1)。图1.流程图?(3)程序代码如下#include#includestruct struCHchar ch;struct struCH *next;struCH,*temp

5、,*head,*shift,*top,*base;FILE *fp;char curchar;char curtocmp;char ch;int right, i,j;int table59=1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,1,0,0,0;void main(int argc,char *argv)void puch(char ch);void pop();void doforpush(int t);void identify();int err =0, k=0,

6、 countchar=0, row ;int m=0;int charerr=0;if(fp=fopen(argv1,r)=NULL)printf(ntCan not open file %s,or not exist it!n,argv1);exit(0);?else printf(ntSuccess open file: %sn,argv1);while(!feof(fp)ch=getc(fp);countchar+;rewind(fp);if(countchar=0)printf(t%s is a blank file!n,argv1);exit(0);while(k(countchar

7、-1)ch=getc(fp);if(!(ch=(|ch=)|ch=i|ch=+|ch=-|ch=*|ch= |ch=#|ch=n)charerr=1;err +;k+;rewind(fp);if(charerr=1)printf(nt%d Unindentify characters in file %s n,err ,argv1);exit(0);for(row =1;mnext=NULL;base-ch=#;temp=malloc(sizeof(struCH);temp-next=base;temp-ch=E;top=temp;shift=malloc(sizeof(struCH);shi

8、ft-next=NULL;head=shift;ch=getc(fp);putchar(ch);m+;while(ch!=n&mch=ch;temp-next=NULL;shift-next=temp;shift=shift-next;ch=getc(fp);if(m!=(countchar-1) putchar(ch);m+;head=head-next;shift=head;putchar(n);identify();if(!right)printf(%s Line %d:t error expression!n,argv1,row );elseprintf(%s Line %d:t ri

9、ght expression!n,argv1,row );putchar(n);printf(Completed!n);fclose(fp);exit(0);void push(char ch)temp=malloc(sizeof(struCH);temp-ch=ch;temp-next=top;top=temp;void pop(void)curtocmp=top-ch;if(top-ch!=#)top=top-next;void doforpush(int t)switch(t)case 0:push(A);push(T);break;case 5:push(A);push(T);brea

10、k;case 11:push(A);push(T);push(+);break;case 12:push(A);push(T);push(-);break;case 20:push(B);push(F);break;case 25:push(B);push(F);break;case 33:push(B);push(F);push(*);break;case 34:push(B);push(F);push( );break;case 40:push(i);break;case 45:push();push(E);push();void changchartoint()switch(curtocmp)case A:i=1;break;case B:i=3;break;case E:i=0;break;case T:i=2;break;case F:i=4;switch(cu

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号