编译原理实验3算符优先分析.docx
- 文档编号:6935191
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:23
- 大小:20.72KB
编译原理实验3算符优先分析.docx
《编译原理实验3算符优先分析.docx》由会员分享,可在线阅读,更多相关《编译原理实验3算符优先分析.docx(23页珍藏版)》请在冰豆网上搜索。
编译原理实验3算符优先分析
编译原理实验3算符优先分析
一、实验目的
通过设计编制调试构造FIRSTVT集、LASTVT集和构造算符优先表、对给定符号串进展分析的程序,了解构造算符优先分析表的步骤,对文法的要求,生成算符优先关系表的算法,对给定的符号串进展分析的方法。
二、实验容
1.给定一文法G,输出G的每个非终结符的FIRSTVT集和LASTVT集。
2.构造算符优先表。
3.对给定的符号串进展分析,包含符号栈,符号栈栈顶符号和输入串当前符号的优先级,最左素短语和使用的产生式和采取的动作。
三、程序思路
在文法框输入待判断文法产生式,格式E->a|S,注意左部和右部之间是“->〞,每个产生式一行,ENTER键换行。
文法完毕再输入一行G->#E#
1.先做文法判断,即可判断文法情况。
2.假设是算符优先文法,那么在优先表栏显示优先表。
3.写入要分析的句子,按回车即可。
4.在分析过程栏,可以看到整个归约过程情况
四、实验结果
FunctorFirst.h
#include
#include
#include
#include
usingnamespacestd;
#definerightlength20
#defineproduct_num20//产生式最多个数
#definenum_noterminal26//非终结符最多个数
#definenum_terminal26//终结符最多个数
structProduction
{
charLeft;
charRight[rightlength];
intnum;
};
structVT
{
boolvt[num_noterminal][num_terminal];
};
structStack
{
charP;
chara;
};
classCMyDlg
{
public:
CMyDlg();
voidInputRule();
CStringshowLastVT();
CStringshowFirstVT();
CStringshownoTerminal(charG[]);
CStringshowTerminal(charg[]);
CStringshowLeftS(charS[],intj,intk);
voidInitAll();
CStringshowSentence(CStringsen,intstart);
CStringshowStack(charS[],intn);
voidInitarry(chararry[],intn);
CStringProdtoCStr(Productionprod);
intselectProd(inti,intj,charS[]);
voidpreFunctor(CStringsen);
voidinsertFirstVT(StackS[],int&sp,charP,chara);
voidinsertLastVT(StackS[],int&sp,charP,chara);
voidShowPreTable();
voidcreatePreTable();
charpretable[num_terminal][num_terminal];
boollike_Q(Productionprod,charQ);
voidcreateLastVT();
boollikeQ_(Productionprod,charQ);
boollikeQa_(Productionprod);
boollike_aQ(Productionprod);
boollike_a(Productionprod);
boollikea_(Productionprod);
boolDignose(charc);
intfindg(charc);
intfindG(charc);
voidcreateFirstVT();
voidcreateTerminal();
voidcreatenoTerminal();
voidbuildProduction(CStrings);
booltest(CStrings);
voidparse();//语法分析
CStringgram;//存放文法;
Productionproduction[product_num];
VTFirstVT;
VTLastVT;
intlocProduct;//已有产生式个数
charG[num_noterminal];
charg[num_terminal];
inti_G;
inti_g;
CStringm_sen;
};
FunctorFirst.cpp
#include"FunctorFirst.h"
CMyDlg:
:
CMyDlg()
{
}
boolCMyDlg:
:
test(CStrings)//测试是否是算符优先文法
{
boolt=1;
for(inti=0;i if(s[i]>64&&s[i]<91&&s[i+1]>64&&s[i+1]<91) { t=0; break; } returnt; } voidCMyDlg: : InputRule() { stringinfile; stringline; cout<<"请输入语法文件的路径: "; cin>>infile; cout< ifstreaminput(infile.c_str()); if(! input) { cout< cout<<"! ! ! 请再次运行本程序! ! ! "< exit(0); } while(getline(input,line)) { if(test(line.c_str())==0) { cout< "< exit(0); } buildProduction(line.c_str()); } cout< "< input.close(); } voidCMyDlg: : buildProduction(CStrings) { inti=0; intj=0; intk=0; for(k=0;k { if(s[k]! ='') { production[locProduct].Left=s[k]; break; } } for(i=k+1;i { if(s[i-1]=='-'&&s[i]=='>') break; } inttemp=i; for(i=temp+1;i { if(s[i]! ='|') { if(s[i]! ='') { production[locProduct].Right[j]=s[i]; j++; production[locProduct].num=j; } } else { locProduct++; production[locProduct].Left=production[locProduct-1].Left; j=0; } } locProduct++; } voidCMyDlg: : createnoTerminal()//建立非终结符索引 { i_G=0;//最后一个位置的下一个下标 intj=0; for(inti=0;i { for(j=0;j { if(production[i].Left! =G[j]) j++; else break; } if(j>i_G-1) { G[i_G]=production[i].Left; i_G++; } } } voidCMyDlg: : createTerminal()//建立终结符索引 { i_g=0;//最后一个位置的下一个下标 intj=0; for(inti=0;i { for(intk=0;k { chartemp=production[i].Right[k]; if(Dignose(temp)) { for(j=0;j { if(temp! =g[j]) j++; else break; } if(j>i_g-1) { g[i_g]=temp; i_g++; } } } } } voidCMyDlg: : createFirstVT()//production已完成,创立FirstVT { inti,j; StackS[100]; intsp=0; for(i=0;i for(j=0;j FirstVT.vt[i][j]=false; for(i=0;i { if(likea_(production[i])) insertFirstVT(S,sp,production[i].Left,production[i].Right[0]); if(likeQa_(production[i])) insertFirstVT(S,sp,production[i].Left,production[i].Right[1]); } while(sp>0) { sp--; charQ=S[sp].P; chara=S[sp].a; for(i=0;i { if(likeQ_(production[i],Q)) insertFirstVT(S,sp,production[i].Left,a); } } } voidCMyDlg: : createLastVT()//创立Last集 { inti,j; StackS[100]; intsp=0; for(i=0;i for(j=0;j LastVT.vt[i][j]=false; for(i=0;i { if(like_a(production[i])) insertLastVT(S,sp,production[i].Left,production[i].Right[production[i].num-1]); if(like_aQ(production[i])) insertLastVT(S,sp,production[i].Left,production[i].Right[production[i].num-2]); } while(sp>0) { sp--; charQ=S[sp].P; chara=S[sp].a; for(i=0;i { if(like_Q(production[i],Q)) insertLastVT(S,sp,production[i].Left,a); } } } intCMyDlg: : findG(charc)//定位c在G中的下标 { inti=0; for(i=0;i if(c==G[i]) break; returni; } intCMyDlg: : findg(charc)//定位c在g中的下标 { inti=0; for(i=0;i if(c==g[i]) break; returni; } boolCMyDlg: : Dignose(charc)//判断c是终结符还是非终结符,终结符true,非终结符false { if(c>64&&c<91) returnfalse; else returntrue; } boolCMyDlg: : likea_(Productionprod) { if(Dignose(prod.Right[0])) returntrue; else returnfalse; } boolCMyDlg: : like_a(Productionprod)//形如P->…a型产生式 { if(Dignose(prod.Right[prod.num-1])) returntrue; else returnfalse; } boolCMyDlg: : like_aQ(Productionprod)//形如P->…aQ型产生式 { if(prod.num<1) returnfalse; else { if(Dignose(prod.Right[prod.num-2])&&(! Dignose(prod.Right[prod.num-1]))) returntrue; else returnfalse; } } boolCMyDlg: : likeQa_(Productionprod) { if(prod.num<1) returnfalse; else { if(Dignose(prod.Right[1])&&(! Dignose(prod.Right[0]))) returntrue; else returnfalse; } } boolCMyDlg: : likeQ_(Productionprod,charQ) { if(prod.Right[0]==Q) returntrue; else returnfalse; } boolCMyDlg: : like_Q(Productionprod,charQ) { if(prod.Right[prod.num-1]==Q) returntrue; else returnfalse; } voidCMyDlg: : createPreTable()//创立优先表 { //初始化优先表pretable inti,j; for(i=0;i for(j=0;j pretable[i][j]='';//表错误 for(j=0;j { for(i=0;i { charxi,xi1,xi2; xi=production[j].Right[i]; xi1=production[j].Right[i+1]; xi2=production[j].Right[i+2]; if(Dignose(xi)&&Dignose(xi1)) pretable[findg(xi)][findg(xi1)]='='; if(i Dignose(xi1))) pretable[findg(xi)][findg(xi2)]='='; if(Dignose(xi)&&(! Dignose(xi1))) { intN=findG(xi1); for(intk=0;k if(FirstVT.vt[N][k]==true) pretable[findg(xi)][k]='<'; } if((! Dignose(xi))&&Dignose(xi1)) { intN=findG(xi); for(intk=0;k if(LastVT.vt[N][k]==true) pretable[k][findg(xi1)]='>'; } } } } voidCMyDlg: : ShowPreTable()//显示相关集合和优先表 { CStringstr=""; str=str+"终结符"+showTerminal(g)+"\r\n"; str=str+"非终结符"+shownoTerminal(G)+"\r\n"; str=str+"First集合: \r\n"+showFirstVT(); str=str+"Lasst集合: \r\n"+showLastVT(); str=str+"|"; inti,j; for(i=0;i str=str+g[i]+"|"; str=str+"\r\n"; for(j=0;j str=str+"…………"; str+="\r\n"; for(i=0;i { str=str+g[i]+"|"; for(j=0;j str=str+pretable[i][j]+"|"; str+="\r\n"; for(j=0;j str=str+"…………"; str+="\r\n"; } cout< } voidCMyDlg: : insertFirstVT(StackS[],int&sp,charP,chara) { if(FirstVT.vt[findG(P)][findg(a)]==false) { FirstVT.vt[findG(P)][findg(a)]=true; S[sp].P=P; S[sp].a=a; sp++; } } voidCMyDlg: : insertLastVT(StackS[],int&sp,charP,chara) { if(LastVT.vt[findG(P)][findg(a)]==false) { LastVT.vt[findG(P)][findg(a)]=true; S[sp].P=P; S[sp].a=a; sp++; } } voidCMyDlg: : preFunctor(CStringsen)//算符优先分析过程实现 { booltagbreak=true; charS[100]; intk=0; S[k]='#'; inti=0;//表下次读入位置 intj=0;// chara; CStringshow=""; CStringtemp=""; temp.Format("%-15s%s%15s%-15s%-10s%-15s\r\n\r\n","符号栈","关系","输入串","最左素短语","使用产生式","下步动作"); show=show+temp; temp=""; CStrings_stack,s_sentence,s_lefts,s_prod,s_action; chars_presymbol; do { a=sen[i]; if(Dignose(S[k])) j=k; else j=k-1; while(pretable[findg(S[j])][findg(a)]=='>') { s_stack=showStack(S,k); s_presymbol=pretable[findg(S[j])][findg(a)]; s_sentence=showSentence(sen,i); charQ; do { Q=S[j]; if(Dignose(S[j-1])) j=j-1; else j=j-2; }while(pretable[findg(S[j])][findg(Q)]=='>'||pretable[findg(S[j])][findg(Q)]=='='); intn=selectProd(j+1,k,S); if(n>-1&&n { s_lefts=showLeftS(S,j+1,k); k=j+1; S[k]=production[n].Left; s_prod=ProdtoCStr(production[n]); s_action="归约"; temp.Format("%-15s%c%15s%-15s%-10s%-15s\r\n",s_stack,s_presymbol,s_sentence,s_lefts,s_prod,s_action); show=show+temp; s_s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 优先 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)