算符优先算法Word下载.docx
- 文档编号:18113959
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:13
- 大小:17.02KB
算符优先算法Word下载.docx
《算符优先算法Word下载.docx》由会员分享,可在线阅读,更多相关《算符优先算法Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
#'
)
{
U--;
cout<
文法规则的个数U="
U<
endl<
break;
}
}
请输入此文法的非终结符(以#号结束):
for(inte1=1;
e1<
e1++)
NT[e1];
U1++;
if(NT[e1][0]=='
{U1--;
//U1为非终结符个数
非终结符个数U1="
U1<
NT[0]='
'
;
break;
}
请输入此文法终结符个数(第一个请输入空格,最后别忘输入$,以#号结束):
for(inte2=1;
e2<
e2++)
VT[e2];
U2++;
//U2为终结符个数
if(VT[e2][0]=='
{U2--;
cout<
终结符个数U2="
U2<
VT[0]='
intNV[10][10]={0};
//NV数组存放FIRSTVT集
intNVL[10][10]={{0},{0},{0},{0}};
//NVL数组存放LASTVT集
structas//符号对结构体
{
charNT;
charVT;
};
structstack//符号对堆栈
as*base;
as*top;
stacks;
stacks1;
s.base=(as*)malloc(11*sizeof(as));
s.top=s.base;
s1.base=(as*)malloc(11*sizeof(as));
s1.top=s1.base;
/*****************************以下求FIRSTVT集***************************/
FIRSTVT集为:
for(i=0;
i<
U;
i++)
if(yuju[i][3]>
='
A'
&
yuju[i][3]<
Z'
yuju[i][4]=='
\0'
);
//E->
A型
else
{
if(yuju[i][3]<
'
||yuju[i][3]>
)//E->
a...型
{
s.top->
NT=yuju[i][0];
VT=yuju[i][3];
}
elseif(yuju[i][4]<
||yuju[i][4]>
Aa...型
{
VT=yuju[i][4];
cout<
s.top->
NT;
for(j=1;
j<
U1;
j++)
if((NT[j][0]-s.top->
NT)==0)break;
VT<
for(k=1;
k<
U2;
k++)
if((VT[k][0]-s.top->
VT)==0)break;
}
NV[j][k]=1;
s.top++;
j=1;
k=1;
}/*进栈*/
while(s.base!
=s.top)
i=0,j=1,k=1;
asd;
d.NT=(--s.top)->
d.VT=(s.top)->
VT;
for(i=0;
if(yuju[i][3]==d.NT&
VT=d.VT;
for(j=1;
{
if((NT[j][0]-s.top->
}
cout<
cout<
for(k=1;
{
if((VT[k][0]-s.top->
NV[j][k]=1;
s.top++;
break;
}
/*******************************以下求LASTVT集********************************/
LASTVT集为:
while(yuju[i][w]!
)w++;
if((yuju[i][w-1]>
yuju[i][w-1]<
)&
w==4);
if(yuju[i][w-1]<
||yuju[i][w-1]>
...a型
{
s1.top->
VT=yuju[i][w-1];
elseif(yuju[i][w-2]<
||yuju[i][w-2]>
...aA型
{
VT=yuju[i][w-2];
}
s1.top->
for(j=1;
if((NT[j][0]-s1.top->
for(k=1;
if((VT[k][0]-s1.top->
}
NVL[j][k]=1;
s1.top++;
w=0;
while(s1.base!
=s1.top)
i=0,j=1,k=1;
asd1;
d1.NT=(--s1.top)->
d1.VT=(s1.top)->
for(i=0;
i++)
if(yuju[i][3]==d1.NT&
VT=d1.VT;
for(j=1;
{
}
{
}
s1.top++;
break;
/*****************************以下求算符优先数组表*******************************/
算符优先表为:
charyouxian[10][10]={{'
},{'
}};
//算符优先数组表
j=3;
while(yuju[i][j]!
if((yuju[i][j]<
||yuju[i][j]>
(yuju[i][j+1]<
||yuju[i][j+1]>
yuju[i][j+1]!
)
{//Xi和Xi+1都是终结符,xi=xi+1
for(k=1;
k++)//找终结符的位置
if((VT[k][0]-yuju[i][j])==0)break;
for(q=1;
q<
q++)//找终结符的位置
if((VT[q][0]-yuju[i][j+1])==0)break;
youxian[k][q]='
youxian[k][q]<
(yuju[i][j+1]>
yuju[i][j+1]<
(yuju[i][j+2]<
||yuju[i][j+2]>
yuju[i][j+2]!
{//Xi和Xi+2是终结符,但Xi+1为非终结符,xi=xi+2
k++)//找终结符的位置
if((VT[k][0]-yuju[i][j])==0)break;
if((VT[q][0]-yuju[i][j+2])==0)break;
))
{//Xi为终结符,Xi+1为非终结符,xi<
FIRSTVT(xi+1)
for(m=1;
m<
m++)//找非结符的位置
if((NT[m][0]-yuju[i][j+1])==0)break;
for(n=1;
n<
n++)
if(NV[m][n]==1)
youxian[k][n]='
}
else//Xi为非终结符,Xi+1为终结符,LASTVT(xi)>
xi+1
if((yuju[i][j]>
yuju[i][j]<
{
if((VT[k][0]-yuju[i][j+1])==0)break;
}
m++)//找非结符的位置
if((NT[m][0]-yuju[i][j])==0)break;
n++)
if(NVL[m][n]==1)youxian[n][k]='
j++;
m=1;
n=1;
k++)//U2为终结符个数
if(NV[1][k]==1)youxian[U2][k]='
//'
$'
(所有文法开始符号的FIRSTVT集的终结符)
if(NVL[1][k]==1)youxian[k][U2]='
//(所有文法开始符号的LASTVT集的终结符)>
youxian[U2][U2]='
for(w=0;
w<
U2+1;
w++)//显示算符优先表
for(intq=0;
q++)cout<
youxian[w][q]<
"
/***************************以下是总控程序*********************************/
请输入符号串:
charsk[100];
inth=1,f;
sk[0]='
sk[1]='
//sk[]数组当堆栈进行归约和移进
chara[100],Q,N;
N='
N'
intb=0;
a[0]=getchar();
//a[]数组存放输入串
if(a[b]<
9'
a[b]>
1'
)a[b]='
i'
while(a[b++]!
)a[b]=getchar();
getchar();
b=0;
while(a[b]!
@'
if(sk[h]<
||sk[h]>
)f=h;
//终结符
elsef=h-1;
a[b]<
while(youxian[lk(sk[f])][lk(a[b])]=='
)//栈顶的终结符号和待输入的优先关系是>
时,
do{
Q=sk[f];
f=f-1;
if(sk[f]>
sk[f]<
)//非终结符
}while(youxian[lk(sk[f])][lk(Q)]=='
||youxian[lk(sk[f])][lk(Q)]=='
h=f+1;
/*if(sk[h]=='
*'
error"
a[b]='
}*/
sk[h]=N;
归约"
if(a[b]=='
f==1)
正确"
if(a[b]=='
else{
if(youxian[lk(sk[f])][lk(a[b])]=='
||youxian[lk(sk[f])][lk(a[b])]=='
{//栈顶的终结符号和待输入的优先关系是<
或=时,移进输入符号
移进"
h=h+1;
sk[h]=a[b];
a[b++];
system("
pause"
return0;
}
intlk(chara1)//函数lk用于定位终结符的位置
{
stringVT[]={"
"
+"
*"
("
)"
i"
$"
};
intx=0;
for(x=0;
x<
10;
x++)
if(a1-VT[x][0]==0)
returnx;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优先 算法