资源描述:
《基于算符优先分析方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于算符优先分析方法的表达式语法分析器年级:2007级班级:计算机科学与技术四班姓名:欧垚学号:20074042154指导老师:段明秀年月日目录摘要……………………………………………………………2关键字…………………………………………………………2构造算符优先表………………………………………………3构造优先分析器………………………………………………6分析归约流程图………………………………………………7运行……………………………………………………………8测试……………………………………………………………9参考文献……………………………………………………12附加代码……
2、………………………………………………13摘要:算符优先分析法是Floyd在1963年首先提出来的,是一种古典而又实用的方法,用这种方法在分析程序语言中的各类表达式时尤为有效。不少编译程序中都使用这种方法分析表达式。算符优先分析法就是仿照算术表达式的运算过程而提出的一种自底向上的语法分析方法。其基本思想是:首先规定算符,这里是文法的终极符之间的优先关系,然后根据这种优先关系,通过比较相邻算符的优先次序来确定句型中的“句柄”,然后进行归约。算符优先分析法的关键:算符优先分析法的关键就是寻找当前句型中的最左素短语,并归约它。关键字:小于、大于、等于、句柄、归约、一、对表达
3、式文法G[E’]构造算符优先关系表。计算算符优先只针对于终结符,终结符之间的优先关系有三种,在计算优先关系之前我们先定义两个集合,对于任意两个终结符(a,b)FIRSTVT(B)={b
4、B=>b…或B=>Cb…},其中…表示V*中的符号串。LASTVT(B)={a
5、B=>…a或B=>…aC}三种优先关系:(1)等于关系:可直接查看产生式的右部,对如下形式的产生式A->…ab…A->…aBb…则有a=b成立。(2)小于关系:求出每个非终结符B的FIRSTVT(B),观察如下形式的产生式A->…aB…对每一b∈FIRSTVT(B)有a≮b成立(3)大于关系:计算每个非终
6、结符B的LASTVT(B),观察如下形式的产生式A->…Bb…对每一a∈LASTVT(B)有a≯b成立表达式文法G[E’]:E’→#E#E→E+Q
7、QQ→Q-T
8、TT→T*F
9、FF→F/M|MM→M^P|PP→(E)|i根据上面的规则手工构造上述文法的算符优先表如下:+-*/^()i#+≯≮≮≮≮≮≯≮≯-≯≯≮≮≮≮≯≮≯*≯≯≯≮≮≮≯≮≯/≯≯≯≯≮≮≯≮≯^≯≯≯≯≯≮≯≮≯(≮≮≮≮≮≮=≮)≯≯≯≯≯≯≯i≯≯≯≯≯≯≯#≮≮≮≮≮=packagecom.op.core;/*****************************************
10、***************************************简单表达式文法G[E’]构造算符优先关系表。*E’→#E#*E→E+Q
11、Q*Q→Q-T
12、T*T→T*F
13、F*F→F/M|M*M→M^P|P*P→(E)|i*@author*/publicclassPriorityTable{privatestaticchartable[][]={//+*/i()#^{'>','<','<','<','<','>','>','<'},//+{'>','>','>','<','<','>','>','<'},//*{'>','>','>','<','<','>
14、','>','<'},///{'>','>','>','$','$','>','>','>'},//i{'<','<','<','<','<','=','$','<'},//({'>','>','>','$','$','>','>','>'},//){'<','<','<','<','<','$','=','<'},//#{'>','>','>','<','<','>','>','<'},//^};//算符优先表/****************************************************************************判
15、断一个符号在算符优先表中位置**@paramc*@return*/privatestaticintjudgePriority(charc){intpriority=0;switch(c){case'+':priority=0;break;case'*':priority=1;break;case'/':priority=2;break;case'i':priority=3;break;case'(':priority=4;break;case')':priority=5;break;case'#':priority=6;break;case'^':priorit