编译原算符优先分析实验报告.docx
《编译原算符优先分析实验报告.docx》由会员分享,可在线阅读,更多相关《编译原算符优先分析实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
编译原算符优先分析实验报告
学号E10714103专业计算机科学与技术姓名万学进
实验日期2010-5-25教师签字成绩
实验报告
【实验名称】算符优先文法分析
【实验目的】
掌握算符优先分析法的原理,利用算符优先分析法将赋值语句进行语法分析,翻译成等价的四元式表示。
【实验内容】
1.算术表达式的文法可以是:
(1)S->#E#
(2)E->E+T
(3)E->T
(4)T->T*F
(5)T->F
(6)F->P^F
(7)F->P
(8)P->(E)
(9)P->i
2.根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。
【设计思想】
(1)定义部分:
定义常量、变量、数据结构。
(2)初始化:
设立算符优先关系表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);
(3)控制部分:
从键盘输入一个表达式符号串;
(4)利用算符优先文法分析算法进行表达式处理:
根据优先关系表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
【流程图】
【源代码】
#include
#include
#include
charGrammar[20][10];
charVN[10],VT[10];
charBoolArray[10][10];
charFirstBoolArray[10][10];
charLastBoolArray[10][10];
charRelationShip[10][10];
#defineStackSize100;
intvtNum,vnNum;
intgrammarNum;
intscount=0;
intVNum[20];
intGF[2][10];
typedefstruct{
charvt;
charvn;
}array;
typedefstruct{
array*base;
array*top;
intstacksize;
}SqStack;
typedefstruct{
chars[20];
intstep;
charcurInVt;
}CharType;
typedefstruct{
CharType*base;
CharType*top;
}Stack;
typedefstruct
{
intx;
inty;
}Position;
SqStackS;
StackCS;
SqStackInitStack()
{
inti,j;
S.base=(array*)malloc(100*sizeof(array));
if(!
S.base)exit
(1);
S.top=S.base;
S.stacksize=StackSize;
arraytemp;
printf("初始化栈:
\n");
for(i=1;i<=vnNum;i++)
{
for(j=1;j<=vtNum;j++)
{
if(BoolArray[i][j]=='1')
{
temp.vt=BoolArray[0][j];
temp.vn=BoolArray[i][0];
*S.top=temp;
S.top++;
printf("%c,%c\n",temp.vn,temp.vt);
}
}
}
returnS;
}
intvNumCount()
{
for(inti=0;i<=grammarNum;i++)
{
intj=1;
while(Grammar[i][j]!
='\0')
{
j++;
}
VNum[i]=j;
printf("%d",VNum[i]);
}
printf("\n");
return0;
}
intScanGrammar()
{
FILE*fp=fopen("算符优先文法.txt","r");
FILE*tp;
charsingleChar,nextChar;
inti=0,j=0,k,count;
while(!
feof(fp))
{
fscanf(fp,"%c",&singleChar);
if(singleChar=='?
')
{
Grammar[i][j]='\0';
break;
}
if(singleChar=='\n')
{
Grammar[i][j]='\0';
i++;
j=0;
continue;
}
if(singleChar=='-')
{
tp=fp;
fscanf(tp,"%c",&nextChar);
if(nextChar=='>')
{
fp=tp;
continue;
}
}
if(singleChar=='|')
{
Grammar[i+1][0]=Grammar[i][0];
Grammar[i][j]='\0';
i++;
j=1;
continue;
}
Grammar[i][j]=singleChar;
if(singleChar>='A'&&singleChar<='Z')
{
count=0;
while(VN[count]!
=singleChar&&VN[count]!
='\0')
{
count++;
}
if(VN[count]=='\0')
{
VN[count]=singleChar;
vnNum=count+1;
}
}
else
{
count=0;
while(VT[count]!
=singleChar&&VT[count]!
='\0')
{
count++;
}
if(VT[count]=='\0')
{
VT[count]=singleChar;
vtNum=count+1;
}
}
j++;
}
printf("输入的文法:
\n");
for(k=0;k<=i;k++)
{
j=0;
while(Grammar[k][j]!
='\0')
{
if(j==1)
{
printf("->");
}
printf("%c",Grammar[k][j]);
j++;
}
printf("\n");
}
printf("vnNum:
%d\n",vnNum);
printf("vtNum:
%d\n",vtNum);
printf("%d\nVN:
",i);
count=0;
while(VN[count]!
='\0')
{
BoolArray[count+1][0]=VN[count];
LastBoolArray[count+1][0]=VN[count];
printf("%d%c",count+1,BoolArray[count+1][0]);
count++;
}
printf("\nVT:
");
count=0;
while(VT[count]!
='\0')
{
BoolArray[0][count+1]=VT[count];
LastBoolArray[0][count+1]=VT[count];
printf("%d%c",count+1,BoolArray[0][count+1]);
count++;
}
printf("\n");
fclose(fp);
returni;
}
intprint()
{
for(inti=1;i<=vnNum;i++)
for(intj=1;j<=vtNum;j++)
{
if(BoolArray[i][j]=='1')
printf("%c%c\n",BoolArray[i][0],BoolArray[0][j]);
}
return0;
}
intprintlast()
{
for(inti=1;i<=vnNum;i++)
for(intj=1;j<=vtNum;j++)
{
if(LastBoolArray[i][j]=='1')
printf("%c%c\n",LastBoolArray[i][0],LastBoolArray[0][j]);
}
return0;
}
intBoolArrayInitial(charvn,charvt)
{
introw=1,column=1;
while(BoolArray[row][0]!
=vn)
{
row++;
}
while(BoolArray[0][column]!
=vt)
{
column++;
}
if(BoolArray[row][column]=='1')
{
return0;
}
BoolArray[row][column]='1';
printf("%d%d\n",row,column);
return0;
}
intLastBoolArrayInitial(charvn,charvt)
{
introw=1,column=1;
while(LastBoolArray[row][0]!
=vn)
{
row++;
}
while(LastBoolArray[0][column]!
=vt)
{
column++;
}
if(LastBoolArray[row][column]=='1')
{
return0;
}
LastBoolArray[row][column]='1';
printf("%d%d\n",row,column);
return0;
}
intFirstInitial(intgrammarNum)
{
inti;
for(i=0;i<=grammarNum;i++)
{
if(Grammar[i][1]<'A'||Grammar[i][1]>'Z')
{
BoolArrayInitial(Grammar[i][0],Grammar[i][1]);
continue;
}
if(Grammar[i][1]>='A'&&Grammar[i][1]<='Z'&&Grammar[i][2]!
='\0')
{
if(Grammar[i][2]<'A'||Grammar[i][2]>'Z')
BoolArrayInitial(Grammar[i][0],Grammar[i][2]);
}
}
printf("文法表中各行文法字符数:
");
vNumCount();
return0;
}
intLastInitial(intgrammarNum)
{
inti,count;
for(i=0;i<=grammarNum;i++)
{
count=VNum[i]-1;
if(Grammar[i][count]<'A'||Grammar[i][count]>'Z')
{
LastBoolArrayInitial(Grammar[i][0],Grammar[i][count]);
continue;
}
if(count<=1)continue;
if(Grammar[i][count]>='A'&&Grammar[i][count]<='Z'&&Grammar[i][count-1]!
='\0')
{
if(Grammar[i][count-1]<'A'||Grammar[i][count-1]>'Z')
LastBoolArrayInitial(Grammar[i][0],Grammar[i][count-1]);
}
}
printlast();
return0;
}
PositionGetPos(arraytemp)
{
for(inti=1;i<=vnNum;i++)
{
if(BoolArray[i][0]==temp.vn)
break;
}
for(intj=1;j<=vtNum;j++)
{
if(BoolArray[0][j]==temp.vt)
break;
}
Positionpos;
pos.x=i;
pos.y=j;
returnpos;
}
intPrintStack()
{
array*p=S.top,scan;
scount++;
printf("scount%d:
\n",scount);
while(p!
=S.base)
{
scan=*p;
printf("%c%c\n",scan.vn,scan.vt);
p--;
}
return0;
}
intInsert(arraypushTemp)
{
Positionpos;
arrayscan;
pos=GetPos(pushTemp);
if(BoolArray[pos.x][pos.y]=='\0')
{
BoolArray[pos.x][pos.y]='1';
array*p=S.base;
while(p!
=S.top)
{
scan=*p;
if(scan.vn==pushTemp.vn&&scan.vt==pushTemp.vt)
break;
p++;
}
if(p==S.top)
{
S.top++;
*S.top=pushTemp;
PrintStack();
}
}
return1;
}
intPushPop()
{
inti;
arraytemp,pushTemp;
while(S.top!
=S.base)
{
temp=*S.top;
S.top--;
for(i=0;i<=grammarNum;i++)
{
if(Grammar[i][1]==temp.vn)
{
pushTemp.vn=Grammar[i][0];
pushTemp.vt=temp.vt;
Insert(pushTemp);
}
}
}
print();
return0;
}
intLastPushPop()
{
inti,count;
arraytemp,pushTemp;
while(S.top!
=S.base)
{
temp=*S.top;
S.top--;
for(i=0;i<=grammarNum;i++)
{
count=VNum[i]-1;
if(Grammar[i][count]==temp.vn)
{
pushTemp.vn=Grammar[i][0];
pushTemp.vt=temp.vt;
Insert(pushTemp);
}
}
}
print();
return0;
}
intResetStack()
{
inti,j;
arraytemp;
while(S.top!
=S.base)
{
S.top--;
}
printf("\n");
for(i=1;i<=vnNum;i++)
{
for(j=1;j<=vtNum;j++)
{
if(BoolArray[i][j]=='1')
{
temp.vt=BoolArray[0][j];
temp.vn=BoolArray[i][0];
*S.top=temp;
S.top++;
printf("%c,%c\n",temp.vn,temp.vt);
}
}
}
return0;
}
intJudge(inti,intj)
{
if(Grammar[i][j+1]=='\0')return-1;
if(Grammar[i][j]>='A'&&Grammar[i][j]<='Z'&&(Grammar[i][j+1]<'A'||Grammar[i][j+1]>'Z'))
return0;
elsereturn1;
}
PositionGetOpPos(charvni,charvnj)
{
for(inti=1;i<=vtNum;i++)
if(RelationShip[i][0]==vni)
break;
for(intj=1;j<=vtNum;j++)
{
if(RelationShip[0][j]==vnj)
break;
}
Positionpos;
pos.x=i;
pos.y=j;
returnpos;
}
intGetVtPos(charvt)
{
for(inti=1;i<=vtNum;i++)
if(LastBoolArray[i][0]==vt)
break;
returni;
}
intRelEqual()
{
Positionpos;
intj;
for(inti=0;i<=grammarNum;i++)
{
j=1;
while(Grammar[i][j]!
='\0')
{
if(Grammar[i][j+2]=='\0')break;
if((Grammar[i][j]<'A'||Grammar[i][j]>'Z')&&(Grammar[i][j+2]<'A'||Grammar[i][j+2]>'Z'))
{
pos=GetOpPos(Grammar[i][j],Grammar[i][j+2]);
RelationShip[pos.x][pos.y]='=';//2表示=
}
j++;
}
}
return0;
}
intRelShBlanket()
{
introw;
Positionpos;
inti,j;
for(i=1;i<=vtNum;i++)
{
RelationShip[i][0]=BoolArray[0][i];
RelationShip[0][i]=BoolArray[0][i];
}
for(i=0;i<=grammarNum;i++)
{
j=1;
while(Grammar[i][j]!
='\0')
{
if(Judge(i,j)==-1)break;
if(Judge(i,j)==0)
{
row=GetVtPos(Grammar[i][j]);
for(intii=1;ii<=9;ii++)
{
if(LastBoolArray[row][ii]=='1')
{
pos=GetOpPos(LastBoolArray[0][ii],Grammar[i][j+1]);
RelationShip[pos.x][pos.y]='>';//3表示大于
}
}
}
if(Judge(i,j)==1)
{
row=GetVtPos(Grammar[i][j+1]);
for(intii=1;ii<=9;ii++)
{
if(FirstBoolArray[row][ii]=='1')
{
pos=GetOpPos(Grammar[i][j],FirstBoolArray[0][ii]);
RelationShip[pos.x][pos.y]='<';//1表示小于
}
}
}
j++;
}
}
RelEqual();
printf("表达式文法算符优先关系表:
\n");
RelationShip[0][0]='';
for(i=0;i<=vtNum;i++)
{
for(intj=0;j<=vtNum;j++)
{
if(RelationShip[i][j]=='\0')
RelationShip[i][j]='0';
printf("%4c",RelationShip[i][j]);
}
printf("\n");
}
return0;
}
intChangeValue()
{
intchange=0;
inti,j;
for(i=1;i<=vtNum;i++)
for(j=1;j<=vtNum;j++)
{
if(RelationShip[i][j]=='>')
{
if(GF[0][i]<=GF[1][j])
{
GF[0][i]=GF[1][j]+1;
change=1;
}
}
if(RelationShip[i][j]=='<')
{
if(GF[0][i]>=GF[1][j])
{
GF[1][j]=GF[0][i]+1;
change=1;
}
}
if(RelationShip[i][j]=='=')
{
if(GF[0][i]!
=GF[1][j])
{
if(GF[0][i]>GF[1][j])
{
GF[1][j]=GF[0][i];
change=1;
}
if(GF[0][i]{
GF[0][i]=GF[1][j];
change=1;
}
}
}
}
if(change==1)