编译原理实验3算符优先分析Word文件下载.docx
《编译原理实验3算符优先分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验3算符优先分析Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
![编译原理实验3算符优先分析Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/8/293a8d69-cee3-434b-9230-f2c6c28ae1af/293a8d69-cee3-434b-9230-f2c6c28ae1af1.gif)
string>
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&
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]!
|'
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])
else
break;
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))
for(j=0;
i_g;
{
if(temp!
=g[j])
j++;
else
break;
}
if(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;
for(i=