📄 编译原理-算符优先.c
字号:
printf("firstvt:%c ",vnname[i].name);
printf("{");
for(j=0;j<15;j++)
{ if(vnname[i].value[j]!=0)
printf("%c,",vnname[i].value[j]);
}
printf("}");
printf("\n");
}}
}//lastkuohao
//#####################################################################
void last()//计算lastvt
{
int i,j,k,sign=0,v,a,h,c=0;
int r; int la;
///kaishi
for(i=0;i<num;i++)
{
lastvt[i].name=expr[i].vn;
for(j=0;j<15;j++) {
la=j+1;
//求出zuihou一个是终结符的表达式的
for(k=0;k<15;k++)
{
if((expr[i].vright[j]==vt[k])&&(expr[i].vright[j+1]==0) &&(vt[k]!=0))
{
lastvt[i].value[0] =vt[k];
} // 求出第一个是终结符的表达式的,结束
if ((expr[i].vright[j]==vn[k])&&(expr[i].vright[la]==0)&&(vn[k]!=0) )
{
lastvt[i].value[0] =expr[i].vright[j-1];
} //qiu第二个是终结符的
if((expr[i].vright[0]==vn[k])&&(expr[i].vright[1]==0))
{
lastvt[i].value[0] =vn[k];
} // qiu 右部只有一个非终结符的
}
} } // for的括号
k=1;
//last[0].lastname=vnname[0];
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{ //if()
if((lastvt[i].name==lastvt[j].name)&&(i!=j))
{ lastvt[i].value[k]=lastvt[j].value[0];
k++;
}
}
}
//唯一化
for(i=0;i<num;i++)
{for(j=0;j<num;j++)
{ if((lastvt[i].name==lastvt[j].name)&&(i<j))
lastvt[j].name=0;
}}
//rightvn's
for(i=0;i<num;i++)
{for(j=0;j<num;j++)
{ if((rightvnlast[i]==rightvnlast[j] )&&(i<j))
rightvnlast[j]=0;
}}
BB:
sign5=0;
for(i=0;i<num;i++) {
for(j=0;j<num;j++)
{
if((lastvt[i].name==rightvnlast[j])&&(rightvnlast[j]!=0))
{
for(k=0;k<15;k++){
for(v=0;v<num;v++){
if((lastvt[i].value[k]==vn[v])&&(vn[v]!=0))
{mysign1=1; } } }
if(mysign1==0)
{candolast[c].name=lastvt[i].name;
for(a=0;a<num;a++)
{if(lastvt[i].value[a]!=0)
{candolast[c].value[a]=lastvt[i].value[a];
}}
r=c;
c++;}
for(h=0;h<num;h++){
if((rightvnlast[h]==candolast[r].name)&&(rightvnlast[h]!=0))
rightvnlast[h]=0;}
mysign1=0; }}
}
for(i=0;i<num;i++){
for(j=0;j<15;j++)
{ for(k=0;k<num;k++){
if((lastvt[i].value[j]==candolast[k].name)&&(candolast[k].name!=0))
{ sign4=1;
}
if(sign4==1){
for(a=0;a<15;a++){
if (candolast[k].value[a]!=0) {
for(h=0;h<15;h++) {
if((lastvt[i].value[h]==candolast[k].name)||(lastvt[i].value[h]==0))
{lastvt[i].value[h]=candolast[k].value[a];
break;}} } }
}
sign4=0;
}} }
for(h=0;h<num;h++){
if(rightvnlast[h]!=0)
sign5=1;}
if(sign5==1) goto BB;
//将lastvt唯一化
for(i=0;i<num;i++)
{for(j=0;j<num;j++)
for(k=0;k<15;k++){
{ if((lastvt[i].value[j]==lastvt[i].value[k])&&(j<k))
lastvt[i].value[k]=0;
}} }
printf("***************************输出lastvt:******************************\n");
for(i=0;i<num;i++)
{if(lastvt[i].name!=0){
printf(" lastvt:%c ",lastvt[i].name);
printf("{");
for(j=0;j<15;j++)
{ if(lastvt[i].value[j]!=0)
printf("%c , ",lastvt[i].value[j]);
}
printf("}");
printf("\n");
}}
}
//判定文法是否为算符优先文法
//,如是,生成算符优先关系表
void table()
{ int i,j,k,v,h,w,a;
int b,c;
//table 初始花
for(h=0;h<tablenum;h++){
{
fuhaotable[0][h+1]=newvt[h];
fuhaotable[h+1][0]=newvt[h];}
}
for(i=0;i<num+1;i++)
{
for(j=0;j<15;j++)
{for(k=0;k<num+1;k++)
{ for(v=0;v<tablenum+1;v++)
{//如果右部只有一个非终结符
if((expr[i].vright[j]==vn[k])&&(expr[i].vright[j+1]==0)&&(vn[k]!=0)&&(j==0));
//如果右部只有一个终结符
if((expr[i].vright[j]==vn[k])&&(expr[i].vright[j+1]==0)&&(vn[k]!=0)&&(j==0));
// 求出“〉”关系的
if((expr[i].vright[j]==lastvt[k].name)&&(expr[i].vright[j+1]==newvt[v])&&(lastvt[k].name!=0)&&(newvt[v]!=0))
{for(h=0;h<tablenum+1;h++){
for(a=0;a<15;a++){
if((fuhaotable[h][0]==lastvt[k].value[a])&&(lastvt[k].value[a]!=0))
{ for(w=0;w<tablenum+1;w++)
{if((fuhaotable[0][w]==newvt[v])&&(newvt[v]!=0))
{
if(fuhaotable[h][w]==0)
fuhaotable[h][w]='>';
else {printf("本文法不是算符优先文法!!");
goto END;}
}
}
} // }
}}
}
//
//求出“<”关系的
//
//
if((expr[i].vright[j]==vnname[k].name)&&(expr[i].vright[j-1]==newvt[v])&&(vnname[k].name!=0)&&(newvt[v]!=0)&&(j!=0))
{for(h=0;h<tablenum+1;h++){
if((fuhaotable[h][0]==newvt[v])&&(newvt[v]!=0))
{
for(w=0;w<tablenum+1;w++)
{ for(a=0;a<15;a++)
{
if((fuhaotable[0][w]==vnname[k].value[a])&&(vnname[k].value[a]!=0))
{
if(fuhaotable[h][w]==0)
fuhaotable[h][w]='<';
else {printf("本文法不是算符优先文法!!");
goto END;}
}
}
}
}}
}
//求出"="关系的
if((expr[i].vright[j]==newvt[v])&&(expr[i].vright[j+2]==newvt[k])&&(newvt[k]!=0)&&(newvt[v]!=0))
{for(h=0;h<tablenum+1;h++){
// for(a=0;a<15;a++)
{ if((fuhaotable[h][0]==newvt[v])&&(newvt[v]!=0))
{
for(w=0;w<tablenum+1;w++)
{
if((fuhaotable[0][w]==newvt[k])&&(newvt[k]!=0))
{
if(fuhaotable[h][w]==0)
fuhaotable[h][w]='=';
else {printf("本文法不是算符优先文法!!");
goto END;}
}
}
}
}}
}
}}} } //for de
//output
printf("############################得到算符优先关系表如下:#########################\n ");
for(h=0;h<tablenum+1;h++){
for(w=0;w<tablenum+1;w++) {
printf(" %c ",fuhaotable[h][w] ) ;}
printf("\n-------------------------------------------------\n");
}
END:;
} //table 的括号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -