编译原算符优先分析实验报告(共12页)_第1页
编译原算符优先分析实验报告(共12页)_第2页
编译原算符优先分析实验报告(共12页)_第3页
编译原算符优先分析实验报告(共12页)_第4页
编译原算符优先分析实验报告(共12页)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上学号 E 专业 计算机科学与技术 姓名 万学进实验日期2010-5-25 教师签字 成绩实 验 报 告【实验名称】 算符优先文法分析【实验目的】掌握算符优先分析法的原理,利用算符优先分析法将赋值语句进行语法分析,翻译成等价的四元式表示。【实验内容】1.算术表达式的文法可以是: 专心-专注-专业(1)S->#E#(2)E->E+T(3)E->T(4)T->T*F(5)T->F(6)F->PF(7)F->P(8)P->(E)(9)P->i2.根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。 【设计思想

2、】(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立算符优先关系表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用算符优先文法分析算法进行表达式处理:根据优先关系表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。【流程图】【源代码】#include<stdio.h>#include<stdlib.h>#include<string.h>char Grammar2010;char VN10,VT10;char BoolArray1010;char First

3、BoolArray1010;char LastBoolArray1010;char RelationShip1010;#define StackSize 100;int vtNum,vnNum;int grammarNum;int scount=0;int VNum20;int GF210;typedef struct char vt;char vn;array;typedef struct array *base;array *top;int stacksize;SqStack;typedef structchar s20;int step;char curInVt;CharType;typ

4、edef structCharType *base;CharType *top;Stack;typedef structint x;int y;Position;SqStack S;Stack CS;SqStack InitStack()int i,j;S.base=(array *)malloc(100*sizeof(array);if(!S.base)exit(1);S.top=S.base;S.stacksize=StackSize;array temp;printf("初始化栈:n");for(i=1;i<=vnNum;i+)for(j=1;j<=vtN

5、um;j+)if(BoolArrayij='1')temp.vt=BoolArray0j;temp.vn=BoolArrayi0;*S.top=temp;S.top+;printf("%c,%cn",temp.vn,temp.vt);return S;int vNumCount()for(int i=0;i<=grammarNum;i+)int j=1;while(Grammarij!='0')j+;VNumi=j;printf("%d ",VNumi);printf("n");return 0;

6、int ScanGrammar()FILE *fp=fopen("算符优先文法.txt","r"); FILE *tp;char singleChar,nextChar;int i=0,j=0,k,count;while(!feof(fp)fscanf(fp,"%c",&singleChar);if(singleChar='?')Grammarij='0'break;if(singleChar='n')Grammarij='0'i+;j=0;continue;if

7、(singleChar='-')tp=fp;fscanf(tp,"%c",&nextChar);if(nextChar='>')fp=tp;continue;if(singleChar='|')Grammari+10=Grammari0;Grammarij='0' i+;j=1;continue;Grammarij=singleChar;if(singleChar>='A'&&singleChar<='Z')count=0;while(V

8、Ncount!=singleChar&&VNcount!='0')count+;if(VNcount='0')VNcount=singleChar;vnNum=count+1;else count=0;while(VTcount!=singleChar&&VTcount!='0')count+;if(VTcount='0')VTcount=singleChar;vtNum=count+1;j+;printf("输入的文法:n");for(k=0;k<=i;k+)j=0;wh

9、ile(Grammarkj!='0')if(j=1)printf("->");printf("%c",Grammarkj);j+; printf("n");printf("vnNum:%dn",vnNum);printf("vtNum:%dn",vtNum);printf("%dnVN:",i);count=0;while(VNcount!='0')BoolArraycount+10=VNcount;LastBoolArraycount+

10、10=VNcount;printf("%d%c ",count+1,BoolArraycount+10);count+; printf("nVT:");count=0;while(VTcount!='0')BoolArray0count+1=VTcount;LastBoolArray0count+1=VTcount;printf("%d%c ",count+1,BoolArray0count+1);count+;printf("n");fclose(fp); return i;int print()

11、for(int i=1;i<=vnNum;i+)for(int j=1;j<=vtNum;j+)if(BoolArrayij='1')printf("%c %cn",BoolArrayi0,BoolArray0j);return 0;int printlast()for(int i=1;i<=vnNum;i+)for(int j=1;j<=vtNum;j+)if(LastBoolArrayij='1')printf("%c %cn",LastBoolArrayi0,LastBoolArray0j);

12、return 0;int BoolArrayInitial(char vn,char vt)int row=1,column=1;while(BoolArrayrow0!=vn)row+;while(BoolArray0column!=vt)column+;if(BoolArrayrowcolumn='1')return 0;BoolArrayrowcolumn='1'printf("%d %dn",row,column);return 0;int LastBoolArrayInitial(char vn,char vt)int row=1,

13、column=1;while(LastBoolArrayrow0!=vn)row+;while(LastBoolArray0column!=vt)column+;if(LastBoolArrayrowcolumn='1')return 0;LastBoolArrayrowcolumn='1'printf("%d %dn",row,column);return 0;int FirstInitial(int grammarNum)int i;for(i=0;i<=grammarNum;i+)if(Grammari1<'A

14、9;|Grammari1>'Z')BoolArrayInitial(Grammari0,Grammari1);continue;if(Grammari1>='A'&&Grammari1<='Z'&&Grammari2!='0')if(Grammari2<'A'|Grammari2>'Z')BoolArrayInitial(Grammari0,Grammari2);printf("文法表中各行文法字符数:");vNumC

15、ount();return 0;int LastInitial(int grammarNum)int i,count;for(i=0;i<=grammarNum;i+)count=VNumi-1;if(Grammaricount<'A'|Grammaricount>'Z')LastBoolArrayInitial(Grammari0,Grammaricount);continue;if(count<=1)continue;if(Grammaricount>='A'&&Grammaricount<

16、='Z'&&Grammaricount-1!='0')if(Grammaricount-1<'A'|Grammaricount-1>'Z')LastBoolArrayInitial(Grammari0,Grammaricount-1);printlast();return 0;Position GetPos(array temp)for(int i=1;i<=vnNum;i+)if(BoolArrayi0=temp.vn)break;for(int j=1;j<=vtNum;j+)if(Bo

17、olArray0j=temp.vt)break;Position pos;pos.x=i;pos.y=j;return pos;int PrintStack()array *p=S.top,scan;scount+;printf("scount %d:n",scount);while(p!=S.base)scan=*p;printf("%c %cn",scan.vn,scan.vt);p-;return 0;int Insert(array pushTemp)Position pos;array scan;pos=GetPos(pushTemp);if(

18、BoolArraypos.xpos.y='0')BoolArraypos.xpos.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();return 1;int PushPop()int i;array temp,pushTemp;while(S.top!=S.base)temp=*S.top;S.top-;f

19、or(i=0;i<=grammarNum;i+)if(Grammari1=temp.vn)pushTemp.vn=Grammari0;pushTemp.vt=temp.vt;Insert(pushTemp);print();return 0;int LastPushPop()int i,count;array temp,pushTemp;while(S.top!=S.base)temp=*S.top;S.top-;for(i=0;i<=grammarNum;i+)count=VNumi-1;if(Grammaricount=temp.vn)pushTemp.vn=Grammari0

20、;pushTemp.vt=temp.vt;Insert(pushTemp);print();return 0;int ResetStack()int i,j;array temp;while(S.top!=S.base)S.top-;printf("n");for(i=1;i<=vnNum;i+)for(j=1;j<=vtNum;j+)if(BoolArrayij='1')temp.vt=BoolArray0j;temp.vn=BoolArrayi0;*S.top=temp;S.top+;printf("%c,%cn",tem

21、p.vn,temp.vt);return 0;int Judge(int i,int j)if(Grammarij+1='0')return -1;if(Grammarij>='A'&&Grammarij<='Z'&&(Grammarij+1<'A'|Grammarij+1>'Z')return 0;else return 1;Position GetOpPos(char vni,char vnj)for(int i=1;i<=vtNum;i+)if(R

22、elationShipi0=vni)break;for(int j=1;j<=vtNum;j+)if(RelationShip0j=vnj)break;Position pos;pos.x=i;pos.y=j;return pos;int GetVtPos(char vt)for(int i=1;i<=vtNum;i+)if(LastBoolArrayi0=vt)break;return i;int RelEqual() Position pos;int j;for(int i=0;i<=grammarNum;i+)j=1;while(Grammarij!='0

23、9;)if(Grammarij+2='0')break;if(Grammarij<'A'|Grammarij>'Z')&&(Grammarij+2<'A'|Grammarij+2>'Z')pos=GetOpPos(Grammarij,Grammarij+2);RelationShippos.xpos.y='='/2表示=j+;return 0;int RelShBlanket()int row;Position pos;int i,j;for(i=1;i<

24、;=vtNum;i+)RelationShipi0=BoolArray0i;RelationShip0i=BoolArray0i;for(i=0;i<=grammarNum;i+)j=1;while(Grammarij!='0')if(Judge(i,j)=-1)break;if(Judge(i,j)=0)row=GetVtPos(Grammarij);for(int ii=1;ii<=9;ii+)if(LastBoolArrayrowii='1')pos=GetOpPos(LastBoolArray0ii,Grammarij+1);Relation

25、Shippos.xpos.y='>'/3表示大于if(Judge(i,j)=1)row=GetVtPos(Grammarij+1);for(int ii=1;ii<=9;ii+)if(FirstBoolArrayrowii='1')pos=GetOpPos(Grammarij,FirstBoolArray0ii);RelationShippos.xpos.y='<'/1表示小于j+; RelEqual();printf("表达式文法算符优先关系表:n");RelationShip00=' 'f

26、or(i=0;i<=vtNum;i+)for(int j=0;j<=vtNum;j+)if(RelationShipij='0')RelationShipij='0'printf("%4c ",RelationShipij);printf("n");return 0;int ChangeValue()int change=0;int i,j;for(i=1;i<=vtNum;i+)for(j=1;j<=vtNum;j+)if(RelationShipij='>')if(GF0i

27、<=GF1j)GF0i=GF1j+1;change=1;if(RelationShipij='<')if(GF0i>=GF1j)GF1j=GF0i+1;change=1;if(RelationShipij='=')if(GF0i!=GF1j)if(GF0i>GF1j)GF1j=GF0i;change=1;if(GF0i<GF1j)GF0i=GF1j;change=1;if(change=1)ChangeValue();return 0;int PreFunction()int change=0,j;for(int i=1;i<

28、=vtNum;i+)GF0i=1;GF1i=1;ChangeValue();printf("优先函数:n");for(i=0;i<=1;i+)for(j=1;j<=vtNum;j+) printf("%3d",GFij);printf("n");return 0;int PrintCStack()CharType *p=CS.top,scan;while(p!=CS.base)scan=*p;printf("%d %c %sn",scan.step,scan.curInVt,scan.s);p-;ret

29、urn 0;int JudgeVt(char a)for(int j=1;j<=vtNum;j+)if(a=BoolArray0j)return 1;return 0;int JudgeRela(char a,char b)/判断优先关系int apos,bpos;for(int i=1;i<=vtNum;i+)if(a=BoolArray0i)apos=i;if(b=BoolArray0i)bpos=i;if(GF0apos>GF1bpos)return 1;if(GF0apos<GF1bpos)return -1;else return 0;int Reduction()int count=1,i=0,k=1,j,p,sign;char prerela;char operate5;char q;char S100='0',Input20;S0=' 'scanf("%s",Input);Sk='#'printf("步骤 栈 优先关系 当前符号 剩余输入串 移进或规约n");while(Inputi!='0')if(JudgeVt(Sk)j=k;else j=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论