编译原算符优先分析实验报告.docx

上传人:b****4 文档编号:3489457 上传时间:2022-11-23 格式:DOCX 页数:26 大小:71.99KB
下载 相关 举报
编译原算符优先分析实验报告.docx_第1页
第1页 / 共26页
编译原算符优先分析实验报告.docx_第2页
第2页 / 共26页
编译原算符优先分析实验报告.docx_第3页
第3页 / 共26页
编译原算符优先分析实验报告.docx_第4页
第4页 / 共26页
编译原算符优先分析实验报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

编译原算符优先分析实验报告.docx

《编译原算符优先分析实验报告.docx》由会员分享,可在线阅读,更多相关《编译原算符优先分析实验报告.docx(26页珍藏版)》请在冰豆网上搜索。

编译原算符优先分析实验报告.docx

编译原算符优先分析实验报告

学号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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1