《算符优先分析方法.doc》由会员分享,可在线阅读,更多相关《算符优先分析方法.doc(25页珍藏版)》请在金锄头文库上搜索。
1、目录1.课程设计的目的与原理11.1设计目的11.2设计原理12.课程设计环境13.课程设计内容23.1算符优先分析流程图23.2算符优先总流程图33.3算符优先文法43.4 程序调试54.总结6附录62算符优先分析方法.课程设计目的与原理1.1设计目的1. 了解利用算符优先算法进行移进规约分析的方法。2. 锻炼和提高自己的编程能力。3. 熟悉编译原理语法分析的方法,加深对算符优先基本方法的了解。4. 进一步理解编译原理,更好的的学习它的思路,掌握编译原理的理论基础。5. 了解算符优先分析和规范规约的不同以及优缺点。1.2设计原理算符优先分析方法是根据算符之间的优先关系而设计的一种自底向上的语
2、法分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。由于算符优先分析不考虑非终结符之间的优先关系,在归约过程中只要找到可归约串就归约,并不考虑归约到哪个非终结符,因而算符优先归约不是规范归约。.课程设计环境 1.硬件运行环境:Windows XP 2.软件运行环境:VC+ 6.0版本.课程设计内容3.1算符优先分析流程图k:=k+1sk=a置初值块:k:=1,sk:=”#”下一个输入符读入askVTYNj:=kj:=k-1sja?Q:=sjsja?sj-1 VTYNj:=j-1j:=j-1sjE+TE-TT-T*FT-FF-(E)F-i计算FIRST
3、VE和LASTVT集合FirstVT(E)=+,*,(,i LastVT(E)=+,*,),iFirstVT(T)=*,(,i LastVT(T)=*,),iFirstVT(F)=(,i LastVT(F)=),iFirstVT(Q)=# LastVT(Q)=#构造算符优先矩阵+*()i#+*(=i#=对于输入串i+i*i+i#的手动分析过程:步骤符号栈当前符号+剩余输入串移进或归约0#i+ i*i+i #预备1#i+i*i+i #移进2#N+i*i+i #归约3#N+i*i+i #移进4#N+i*i+i #移进5#N+N*i+i #归约6#N+N*i+i #移进7#N+N*i+i #移进8#
4、N+N*N+i #归约9#N+N+i#归约10#N+i#归约11#N+i#移进12#N+i #移进13#N+N#归约14#N#归约15#N#接受见附录3.4程序调试例:1、输入产生式的个数:2、输入文法:3、判断文法4、生成非终结符的FIRSTVT集和LASTVT集:5、生成算符优先分析表:5、输入字符串进行分析:输出结果与自己做的结果一模一样,说明设计成功。.总结经过此次编译课程设计,使我对算符优先分析有了更深更进一步的理解,而且也锻炼了自己的程序编码能力,对自己今后的道路影响不小。当然还有不足之处以后会慢慢改进。在试验过程中,我忘记在程序最后面加上一句getchar();,导致我试验时,直
5、接运行.exe文件,当运行到最后输入归约字符串时,执行完后界面自动关闭,导致我不能截图,经过不屑的努力,有两种解决方法,第一可以用VC软件运行,界面就不会关闭。第二种是在程序里加上getchar();,.exe文件运行到最后就不会自动关闭。附录#include#include#includetypedef structchar R;char r;int flag;array;typedef struct char E;char e;charLode;typedef struct charLode *base; int top;charstack;char str8080,arr8080,brr
6、8080;array F20;int m,kk,p,ppp,FF=1;char r10;int crr2020,FLAG=0;char ccrr1120,ccrr2201;void Initstack(charstack &s)/定义栈s.base=new charLode20; s.top=-1;void push(charstack &s,charLode w) s.top+; s.bases.top.E=w.E; s.bases.top.e=w.e;void pop(charstack &s,charLode &w) w.E=s.bases.top.E; w.e=s.bases.top.
7、e; s.top-;int IsEmpty(charstack s)if(s.top=-1) return 1;else return 0;int IsLetter(char ch) if(ch=A&ch=Z) return 1; else return 0;/judge1是判断是否是算符文法:若产生式中含有两个相继的非终结符则不是算符文法int judge1(int n)int j=3,flag=0;for(int i=0;i=n;i+) while(strij!=0) char a=strij; char b=strij+1; if(IsLetter(a)&IsLetter(b) flag
8、=1;break;else j+; if(flag=1) return 0; else return 1;/judge2是判断文法G是否为算符优先文法:若不是算符文法或若文法中含空字或终结符的优先级不唯一则不是算符优先文法void judge2(int n)for(int i=0;i=n;i+) if(stri3=|judge1(n)=0|FLAG=1)/代表空字 cout该文法不是算符优先文法!n) cout该文法是算符优先文法!endl;/search1是查看存放终结符的数组r中是否含有重复的终结符int search1(char r,int kk,char a)for(int i=0;i
9、kk;i+) if(ri=a) break; if(i=kk) return 0; else return 1;/createF函数是用F数组存放每个终结符与非终结符和组合,并且值每队的标志位为0;F数组是一个结构体void createF(int n)int k=0,i=1;char g;char t10;/t数组用来存放非终结符t0=str00;while(i=n) if(tk!=stri0) k+;tk=stri0;g=tk;i+; else i+;kk=0; char c;for(i=0;i=n;i+) int j=3; while(strij!=0) c=strij; if(IsLe
10、tter(c)=0) if(!search1(r,kk,c) rkk=c;kk+;/r数组用来存放终结符 j+; m=0;for(i=0;ik;i+) for(int j=0;jkk-1;j+) Fm.R=ti; Fm.r=rj; Fm.flag=0; m+; /search函数是将在F数组中寻找到的终结符与非终结符对的标志位值为1void search(charLode w)for(int i=0;im;i+) if(Fi.R=w.E&Fi.r=w.e) Fi.flag=1;break;void FirstVT(int n)/求FirstVTcharstack sta;charLode w;int i=0;Initstack(sta);while(i=n) int k=3; w.E=stri0; char a=strik; char b=strik+1; if(!IsLetter(a)/产生式的后选式的第一个字符就是终结符的情况 w.e=a; push(sta,w); search(w); i+; else if(IsLetter(a)&b!=0&!IsLetter(b)/产生式的后选式的第一个字符是非终结符的情况 w.e=b; push(sta,w); search(w); i+; el