实验三预测分析.docx

上传人:rrsccc 文档编号:10432867 上传时间:2021-05-16 格式:DOCX 页数:6 大小:42.40KB
返回 下载 相关 举报
实验三预测分析.docx_第1页
第1页 / 共6页
实验三预测分析.docx_第2页
第2页 / 共6页
实验三预测分析.docx_第3页
第3页 / 共6页
实验三预测分析.docx_第4页
第4页 / 共6页
实验三预测分析.docx_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《实验三预测分析.docx》由会员分享,可在线阅读,更多相关《实验三预测分析.docx(6页珍藏版)》请在三一文库上搜索。

1、个人资料整理,仅供个人学习使用实验三:预测分析1.实验目的:掌握预测分析程序的分析、设计与实现的基本技术与一般方法。2.实验题目:编写并上机调试完成识别由下列文法所定义的表达式的预测分析程序。-T | T3.实验步骤分析消除左递归文法转化为:E-TE E- +T E |-TE | -FT T-*FT |/FT -(E)|iF 矚慫润厲钐瘗睞枥庑赖賃軔朧。2,判断是否为LL(1) 文法:(1) 求 First() , Follow(),Select() 集First(E)=(,iFollow(E)=),#First(E )=+,- Follow(E )=),#First(T)=(,i Follo

2、w(T)=+,-,),#First(T )=*,/, Follow(T )=+,-,),#First(F)=(,i Follow(F)=*,/,+,-,),#Select(E-TE )=(,i Select(E -+T E )=+Select(E -T E )=-Select(E - ) = ,),#Select(T-FT )=(,i Select(T -*FT )=*Select(T -/FT )=/Select(T - )= ,+,),#Select(F-(E)=(Select(F-i)=i由上可知,相同的左部产生式的Select 集的交集为空,所以为LL(1) 文法由 Select 集构

3、造预测分析表i+-*/()#E-TE 0-TE 5E- +T E 11 - - TE 12-T-FT 20-FT 25T-*FT 33 -/FT 34-F-i40-(E)45(2) 设计算法流程框图:1 / 6个人资料整理,仅供个人学习使用程序参考源码/*/*程序名称:LL(1) 文法分析程序*/*程序用途:编译原理实验 (三 )*/*编写日期:20XX 年 11 月 9 日*/*实验题目:识别下列表达式*/*E-E+T|E-T|T*/*T-T*F|T/F|F*/*F-(E)|i*/*程序版本:1.0 Final*/*程序作者:黄记瑶 B0226047*/*作者邮箱:*/*/*/*程序相关说明

4、*/*A=EB=T*/*0=E 1=E 2=T 3=T 4=F*/*0=i 1=+ 2=- 3=* 4=/ 5=( 6=) 7=#*/*/#include stdio.h#include malloc.hstruct Lcharchar char_ch;struct Lchar *next;Lchar,*p,*h,*temp,*top,*base;char curchar;/ 存储当前待比较字符char curtocmp;/ 存储当前栈顶字符2 / 6个人资料整理,仅供个人学习使用int right;/ 定义开关项int table58=1,0,0,0,0,1,0,0,0,1,1,0,0,0,

5、1,1,1,0,0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,0,1,0,0;/存储预测分析表,1 为有产生式,0 为没有int i,j;void push(char pchar)/ 入栈函数temp=malloc(sizeof(Lchar);temp-char_ch=pchar;temp-next=top;top=temp;void pop(void) / 出栈函数curtocmp=top-char_ch;if(top-char_ch!=#)top=top-next;void doforpush(int t)/ 根据数组下标计算的值产生式入栈switch(t)cas

6、e 0:push(A);push(T);break;case 5:push(A);push(T);break;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:pus

7、h();push(E);push();void changchartoint()/ 根据 curchar,curtocmp 转为数字以判断是否有产生式聞創沟燴鐺險爱氇谴净祸測樅。switch(curtocmp)case A:i=1;break;case B:i=3;break;case E:i=0;break;3 / 6个人资料整理,仅供个人学习使用case T:i=2;break;case F:i=4;switch(curchar)case i:j=0;break;case +:j=1;break;case -:j=2;break;case *:j=3;break;case /:j=4;br

8、eak;case (:j=5;break;case ):j=6;break;case #:j=7;void dosome(void)/ 算法函数int t;for(;)pop();curchar=h-char_ch;printf(n%ct%cn,curchar,curtocmp);if(curtocmp=# & curchar=#)break;if(curtocmp=A|curtocmp=B|curtocmp=E|curtocmp=T|curtocmp=F)残骛楼諍锩瀨濟溆塹籟婭骒東。/当前字符为非终结符if(curtocmp!=#)/ 当前比较字符不为 #changchartoint();i

9、f(tableij)/有产生式t=10*i+j; / 计算产生式在数组中的位置doforpush(t);continue;Else/没有产生式right=0; / 出错break;4 / 6个人资料整理,仅供个人学习使用else/当前比较字符为 #if(curtocmp!=curchar)right=0; / 出错break;elsebreak;/正确Else/当前字符为终结符if(curtocmp!=curchar)right=0;/ 出错break;elseh=h-next;/ 读取下一个字符continue;void main(void)char ch;right=1;/ 开关项为1ba

10、se=malloc(sizeof(Lchar);/ 初始化堆栈base-next=NULL;base-char_ch=#;temp=malloc(sizeof(Lchar);temp-next=base;temp-char_ch=E;top=temp;/ 初始化堆栈h=malloc(sizeof(Lchar);h-next=NULL;p=h;do/ 初始化字符串ch=getch();putch(ch);if(ch=i|ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#)/输入合法字符酽锕极額閉镇桧猪訣锥顧荭钯。temp=malloc(sizeof(Lchar);temp-ne

11、xt=NULL;5 / 6个人资料整理,仅供个人学习使用temp-char_ch=ch;h-next=temp;h=h-next;Else/输入不合法字符temp=p-next;printf(nInput a wrong char!Input again:n);for(;) / 打印当前字符串if (temp!=NULL)printf(%c,temp-char_ch);elsebreak;temp=temp-next;while(ch!=#); /初始化字符串p=p-next;h=p;dosome(); /开始识别if(right)/ 如果开关项为1printf(nOK!n);elseprintf(nError!n);getch();6 / 6

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1