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

下载本文档

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

文档简介

学号 E 专业 计算机科学与技术 姓名 万学进实验日期2010-5-25 教师签字 成绩实 验 报 告【实验名称】 算符优先文法分析【实验目的】掌握算符优先分析法的原理,利用算符优先分析法将赋值语句进行语法分析,翻译成等价的四元式表示。【实验内容】1.算术表达式的文法可以是: 11(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.根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。 【设计思想】(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立算符优先关系表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用算符优先文法分析算法进行表达式处理:根据优先关系表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。【流程图】【源代码】#include#include#includechar Grammar2010;char VN10,VT10;char BoolArray1010;char FirstBoolArray1010;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;typedef 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=vtNum;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)fp=tp;continue;if(singleChar=|)Grammari+10=Grammari0;Grammarij=0; i+;j=1;continue;Grammarij=singleChar;if(singleChar=A&singleChar=Z)count=0;while(VNcount!=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);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=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()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);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,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(Grammari1Z)BoolArrayInitial(Grammari0,Grammari1);continue;if(Grammari1=A&Grammari1=Z&Grammari2!=0)if(Grammari2Z)BoolArrayInitial(Grammari0,Grammari2);printf(文法表中各行文法字符数:);vNumCount();return 0;int LastInitial(int grammarNum)int i,count;for(i=0;i=grammarNum;i+)count=VNumi-1;if(GrammaricountZ)LastBoolArrayInitial(Grammari0,Grammaricount);continue;if(count=A&Grammaricount=Z&Grammaricount-1!=0)if(Grammaricount-1Z)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(BoolArray0j=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(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-;for(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;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=A&Grammarij=Z&(Grammarij+1Z)return 0;else return 1;Position GetOpPos(char vni,char vnj)for(int i=1;i=vtNum;i+)if(RelationShipi0=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)if(Grammarij+2=0)break;if(GrammarijZ)&(Grammarij+2Z)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=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;/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= ;for(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)if(GF0i=GF1j)GF0i=GF1j+1;change=1;if(RelationShipij=GF1j)GF1j=GF0i+1;change=1;if(RelationShipij=)if(GF0i!=GF1j)if(GF0iGF1j)GF1j=GF0i;change=1;if(GF0iGF1j)GF0i=GF1j;change=1;if(change=1)ChangeValue();return 0;int PreFunction()int change=0,j;for(int i=1;i=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

温馨提示

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

评论

0/150

提交评论