编译原理实验3算符优先分析Word文档下载推荐.docx
- 文档编号:19956683
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:23
- 大小:20.72KB
编译原理实验3算符优先分析Word文档下载推荐.docx
《编译原理实验3算符优先分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理实验3算符优先分析Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
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&
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<
s.GetLength()-1;
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;
endl;
ifstreaminput(infile.c_str());
if(!
input)
{
cout<
endl<
###打不开文件,请确认输入的路径有效###"
!
请再次运行本程序!
exit(0);
}
while(getline(input,line))
if(test(line.c_str())==0)
cout<
这不是算符优先文法!
exit(0);
buildProduction(line.c_str());
这是算符优先文法!
input.close();
buildProduction(CStrings)
inti=0;
intj=0;
intk=0;
for(k=0;
k<
s.GetLength();
k++)//得到左部
if(s[k]!
='
'
)
production[locProduct].Left=s[k];
for(i=k+1;
if(s[i-1]=='
-'
s[i]=='
'
inttemp=i;
for(i=temp+1;
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++;
createnoTerminal()//建立非终结符索引
i_G=0;
//最后一个位置的下一个下标
locProduct;
for(j=0;
j<
i_G;
if(production[i].Left!
=G[j])
if(j>
i_G-1)
G[i_G]=production[i].Left;
i_G++;
createTerminal()//建立终结符索引
i_g=0;
for(intk=0;
production[i].num;
k++)
chartemp=production[i].Right[k];
if(Dignose(temp))
i_g;
{
if(temp!
=g[j])
j++;
}
i_g-1)
g[i_g]=temp;
i_g++;
createFirstVT()//production已完成,创立FirstVT
inti,j;
StackS[100];
intsp=0;
for(i=0;
i++)//初始化FirstVT
j++)
FirstVT.vt[i][j]=false;
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;
if(likeQ_(production[i],Q))
insertFirstVT(S,sp,production[i].Left,a);
createLastVT()//创立Last集
LastVT.vt[i][j]=false;
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]);
if(like_Q(production[i],Q))
insertLastVT(S,sp,production[i].Left,a);
intCMyDlg:
findG(charc)//定位c在G中的下标
if(c==G[i])
returni;
findg(charc)//定位c在g中的下标
if(c==g[i])
Dignose(charc)//判断c是终结符还是非终结符,终结符true,非终结符false
if(c>
c<
returnfalse;
returntrue;
likea_(Productionprod)
if(Dignose(prod.Right[0]))
like_a(Productionprod)//形如P->
…a型产生式
if(Dignose(prod.Right[prod.num-1]))
like_aQ(Productionprod)//形如P->
…aQ型产生式
if(prod.num<
1)
if(Dignose(prod.Right[prod.num-2])&
(!
Dignose(prod.Right[prod.num-1])))
likeQa_(Productionprod)
if(Dignose(prod.Right[1])&
Dignose(prod.Right[0])))
likeQ_(Productionprod,charQ)
if(prod.Right[0]==Q)
like_Q(Productionprod,charQ)
if(prod.Right[prod.num-1]==Q)
createPreTable()//创立优先表
//初始化优先表pretable
pretable[i][j]='
//表错误
production[j].num-1;
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<
production[j].num-2&
Dignose(xi)&
Dignose(xi2)&
Dignose(xi1)))
pretable[findg(xi)][findg(xi2)]='
intN=findG(xi1);
if(FirstVT.vt[N][k]==true)
pretable[findg(xi)][k]='
if((!
Dignose(xi))&
intN=findG(xi);
if(LastVT.vt[N][k]==true)
pretable[k][findg(xi1)]='
ShowPreTable()//显示相关集合和优先表
CStringstr="
str=str+"
终结符"
+showTerminal(g)+"
\r\n"
非终结符"
+shownoTerminal(G)+"
First集合:
+showFirstVT();
Lasst集合:
+showLastVT();
|"
str=str+g[i]+"
str=str+"
…………"
str+="
str=str+pretable[i][j]+"
str+="
str=str+"
str.GetBuffer(1000);
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++;
insertLastVT(StackS[],int&
if(LastVT.vt[findG(P)][findg(a)]==false)
LastVT.vt[findG(P)][findg(a)]=true;
preFunctor(CStringsen)//算符优先分析过程实现
booltagbreak=true;
charS[100];
S[k]='
#'
//表下次读入位置
//
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;
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;
Q=S[j];
if(Dignose(S[j-1]))
j=j-1;
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<
locProduct)
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)