预测分析方法--C++版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1编译原理上机实验一、实验题目:预测分析方法二、实验要求:用C++程序设计语言,构建预测分析程序、先进后出栈、预测分析表,实现用程序自动完成预测分析过程。三、程序流图:四、程序代码:#includeiostream#includestringusingnamespacestd;stringtable(chara,charb){char*analist[5][6]={//在子函数中创建二维数组{Te,1,1,Te,1,1},//为了方便表示,用1代表出错{1,+Te,1,1,0,0},//ε用0代替{Ft,1,1,Ft,1,1},{1,0,*Ft,1,0,0},{i,1,1,(E),1,1}};inti=0;intj=0;switch(a){‘#’‘S’进栈,当前终结符送a上托栈顶符号放入XX∈VT?X=‘#’?X=a?X=a?M[X,a]是产生式吗出错结束读入下一符号出错若产生式为X→x1x2……xn按逆序即xn……x2x1入栈2case'E':i=0;break;case'e':i=1;break;case'T':i=2;break;case't':i=3;break;case'F':i=4;break;}switch(b){case'i':j=0;break;case'+':j=1;break;case'*':j=2;break;case'(':j=3;break;case')':j=4;break;case'#':j=5;break;}returnanalist[i][j];}boolisVt(chard)//判断是否是终结符{charvt[5]={'i','+','*','(',')'};for(inti=0;i5;i++){if(vt[i]==d)returntrue;}returnfalse;}voidmain(){intop1,op2;//op1、op2分别为两个栈的栈顶指针stringinputstr;//inputstr表示输入待分析的符号串intmark=0;//mark用来记录程序执行的次数stringstr;//定义str表示返回的产生式chara,X;//流程图中的a、Xcharstack1[30];//用两个数组定义两个栈charstack2[30];op1=0;//初始化栈顶指针op2=0;stack1[op1]='#';//#放入栈1op1++;stack1[op1]='E';//E放入栈1coutendl;//输出所要打印的表头cout****************自顶向下预测分析过程****************endl;coutendl;coutendl;coutLL(1)文法为:endl;coutendl;3coutE-Teendl;coute-+Te|εendl;coutT-Ftendl;coutt-*Ft|εendl;coutF-i|(E)endl;coutendl;cout请输入待分析符号串:endl;cininputstr;//输入待分析符号串coutendl;for(inti=1;iinputstr.length()+1;i++){//输入符号串入栈2stack2[i]=inputstr[inputstr.length()-i];}op2=inputstr.length();a=stack2[op2];op2--;cout对符号串inputstr的分析过程:endlendl;cout步骤'\t'分析栈'\t''\t'剩余输入串'\t'推导所用产生式或匹配endl;sign:mark++;coutmark'\t';//输出程序执行的次数for(intj=0;j(op1+1);j++)//输出分析栈1{coutstack1[j];}cout'\t''\t';X=stack1[op1];//上托栈顶符号放入Xop1--;for(intk=op2+1;k!=0;k--)//输出剩余符号串(即输出栈2){coutstack2[k];}cout'\t''\t';//coutendl;if(isVt(X)){if(X!=a){cout出错,符号串不符合文法。endl;return;}else{cout“a”匹配endl;a=stack2[op2];//读入下一符号op2--;gotosign;}}else4{if(X=='#'){if(X==a){cout接受endl;cout此句子是该文法的句子,正常结束。endl;return;}cout出错,符号串不符合文法。endl;return;}else{str=table(X,a);//返回推导式if(str==1){cout出错,符号串不符合文法。endl;return;}else{if(str!=0){coutX→strendl;for(intl=0;lstr.length();l++)//倒序入栈{stack1[op1+1]=str[str.length()-l-1];op1++;}}else{coutX→εendl;}gotosign;}}return;}}五、实验过程:选取三种不同类型的句子进行分析:①“i+i*i#”5②“(i)*i+i#”6③“(+*i#”7六、对实验结果进行分析:该方法要求文法必须是LL(1)文法。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功