算符优先文法分析.doc_第1页
算符优先文法分析.doc_第2页
算符优先文法分析.doc_第3页
算符优先文法分析.doc_第4页
算符优先文法分析.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

算符优先文法分析1.问题描述基于算符优先分析法的语法分析程序要求:(1)输入已知文法,生成文法矩阵,判断该文法是否是算符优先文法。(2)用程序自动生成该文法的算符优先关系矩阵。(3)对人工输入的句型或句子,分析该句型或句子是否合法,能否用已知文法推出。(4)具有通用性。所开发的程序可适用于不同的文法和任意输入串,且能判断该文法是否为算符优先文法。(5)有运行实例。对于输入的文法和符号串,所编制的语法分析程序应能正确判断此串是否为文法的句子,并要求输出分析过程。2.算符优先分析法2.1算符优先文法定义:设有不含空串的一文法G,如果G中没有形如GBC的产生式,其中B和C为非终结符,且对任意两个终结符a,b之间之多只有,=,三种关系的一种成立,则称G是一个算符优先文法。非终结符的FIRSTVT集合和LASTVT集合FIRSTVT(B)=b|Bb或BCbLASTVT(B)=b|Ba或BaC2.2算符优先矩阵算符优先关系矩阵,判断输入是否满足已知文法的依据。根据非终结符的FIRSTVT集合和LASTVT集合产生。1.“=”关系若Aab或AaBb,则a=b;2.“”关系若AaB,对每一个b属于FIRSTVT(B),有ab;3.“”关系若ABb,对每一个a属于LASTVT(B),有a b。2.3如何规约在分析过程中,利用分析栈存放已识别的那部分句型,而句型的其余部分由剩余输入串组成,通过比较栈顶符号和下一个输入符号之间的关系,可以判别栈顶符号是否为句柄尾符号。如果是句柄尾,则沿栈顶向下,在栈内寻找句柄头(利用 关系)。由 关系和 关系之间包括的符号串就是句柄,然后把它们弹出栈,并代之以归约后的非终结符。这样就完成了一次归约过程。 2.4算符优先分析方法的局限性由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。此外,通常一个适用语言的文法也很难满足算符优先文法的条件,因而致使算符优先分析法仅适用于表达式的语法分析。3概要设计,即算法或流程图本程序有java面向对象的程序设计方法设计。主要类有Suanfu(界面类),Grammar,FirstLast,Table,Guiyue。其中Suanfu完成所有与界面相关的操作;Grammar完成文法的提取,和终结符,非终结符的识别,和初步判断输入文法的正确性;FirstLast完成非终结符FIRSTVT集合和LASTVT集合的构造;Table完成算符优先关系矩阵的构造,并检查文法的二义性。除界面类外,其他类均由构造函数完成其数据处理功能。3.1 算符优先分析流程图算符优先文法的执行过程为:输入已知文法,分析其正确性,提取非终结符和终结符,构造非终结符的FIRSTVT集和LASTVT集,再次基础上构造算符优先关系矩阵,并用来判断表达式是否符合该文法。算符优先文法程序总的流程图为:开始读入文法提取文法并存储识别终结符和非终结符,并存储是否为算符优先文法?生成FIRSTVT和LASTVT生成优先关系矩阵文法是否有二义性?报错报错读入待分析字符串规约过程规约成功?结束不符合文法符合文法 程序总的程序流程图3.2文法分析Grammar类提取文法,识别终结符和非终结符,并简单判断文法是不是算符优先文法。主要数据:g:String 用于存储所有产生式;T:char 用于存储非终结符;t:char 用于存储终结符。大写字母作为非终结符,其余字符均作为终结符。文法分析主要解决的问题有:(存在这些问题的文法,都不是算符优先文法)1. 产生式左边含有终结符2. 产生式右边有相邻非终结符3. 存在非终结符只在产生式右侧不在产生式左侧的4. 不可终结的产生式,即文法没有右侧全为终结符的产生式,此种文法不可产生终结的字符串。5. 不可到达的产生式,即产生式右侧的非终结符补出现在其他产生式中,开始字符除外。3.3文法每个非终结符的FIRSTVT集和LASTVT集FirstLast类用于FIRSTVT集合和LASTVT集合构造。主要数据:first:char 用于存储非终结符的FIRSTVT集合;last: char 用于存储非终结符的LASTVT集合。对FIRSTVT集的构造我们可以给出一个算法,这个算法基于下面两条规则:(1)若有产生式Aa或ABa,则a属于FIRSTVT(A),其中A,B为非终结符,a为终结符(2)若a属于FIRSTVT(B)且有产生式AB则有a属于FIRSTVT(A)。 为了计算方便,我们建立一个布尔数组Fm,n(m为非终结符个数,n为终结符个数)和一个后进先出栈STACK。我们将所有的非终结符排序,用 的序号,再将所有的终结符排序,用 表示终结符a的序号。算法的目的是要合数组每一个元素最终取什满足:F , 的值为真,当且仅当a属于FIRSTVT(A)。至此,显然所有非终结符的FIRSTVT集己完全确定。步骤如下:首先按规则(1)对每个数组元素赋初值。观察这些初值,若F ,的值为真,则将(A ,a)推入栈中,直至对所有数组元素的初值都按此处处理完。然后对栈做以下运算。将栈顶项弹出,设为(B,a),再用规则(2)检查所有产生式,若有形为AB的产生式,而F ,的值是假,则令其变为真,且将(A ,a)推进栈,如此重复直到栈弹空为止。具体的算法可用程序描述为: PROCEDURE INSERT(A,a); IF NOT F , THEN BEGIN F,:=TRUE PUSH(A,a) ONTO STACK END此过程用于当a属于FIRSTVT(A)时置F,为真,并将符号对(A,a)下推到栈中,其主程序为:BEGIN (MAIN)FOR I 从1到m,j从1到nDO F, :=FALSE; FOR 每个形如Aa或ABa的产生式DO INSERT(A,a) WHILE STACK非空 DOBEGIN把STACK的顶项记为(B,a)弹出去FOR 每个形如AB的产生式DO INSERT(A,a)ENDEND (MAIN) 利用类似的方法可求得每个非终结符的LASTVT(A)3.4由LASTVT和FIRSTVT集建立优先矩阵Table类利用之前构造的LASTVT和FIRSTVT生成。主要数据:table: int 用于存储算符优先关系矩阵。有了文法中的每个非终结符的FIRSTVT集和LASTVT集,我们就可以用如下算法最后构造文法的优先关系表FOR 每个产生式A DO FOR i:=1 TO n-1 DO BEGIN IF 和均为终结符 THEN 置 = IF 和都为终结符,但为非终结符 THEN 置 =; IF 为终结符而为非中介符 THEN FOR FIRSTFVT()中的每个b DO置 END以上算法对任何算符文法G可自动构造其算符优先关系表,并可判断G是否为算符优先关系3.5算符文法的分析归约过程算法 自底向上的算符优先分析法,也为自左右向右归约,我们已经知道它不是规范归约。规范归约的关键问题是如何寻找当前句型的句柄,句柄为某一产生式的右面部,归约结果为用与句柄相同的产生式右面部之左部非终结符代替句柄,而算符优先分析归约的关键,是如何找最左素短语,而最左右素短语 应满足: = = 在文法的产生式中存在右面部符号串的符号个数与该素短语的符号个数相等,非终结符号对应,(k=i,j+1)不管其符号名是什么。终结符对应, ,其符号表示要与实际的终结符相一致才有可能形成素短语。由此,我们在分析过程中可以设置一个符号栈S,用以寄存归约或待形成最左素短语的符号串,用一个工作单元a存放当前读入的终结符号,归约成功的标志是当读到句子结束符#时,S本中只剩#N,即只剩句子最左括号“#”和一非终结符N。下面给出分析过程的示意图 在归约时要检查是否有对应产生式的右部与Sj+1Sk形式相符,(忽略非终结符名的不同)若有才可归约,否则出错。在这个分析过程中把“#”也放在终结符串中。3.6算符优先分析的移进规约流程图:置初值k:=1,Sk:=#当前输入符读入a检查是否正常结束Sk属于VTj:=kJ:=k-1Sja?Q:=SjSj-1属于VT?J:=j-2j:=j-1SjQSj+1Sj归约为Nk:=j+1 Sk0:=NSj=#Sj=aSja?出错结束k:=k+1Sk:=a出错 算符优先文法的分析归约过程流程图。4详细设计(源代码)见附件。5调试结果及实验总结在算符优先文法的程序设计过程中,程序比较复杂,光数据结构设计阶段就占据了很长的时间,几种数据结构很难确定那种能满足程序要求。一旦确定了数据结构,程序编写还是比较顺利。很快程序就可以对正确的输入做出正确的处理,不过没有查错纠错的能力,之后加入查错纠错的功能花费了很大的力气。对整个编程的过程把握的不是很好,以致调试很艰难。本程序虽然还不能尽如人意,但本人也已经尽力把所有已知的错误作出修正,这次编程其实收获还是很大的。首先,再一次锻炼了自己独立编程的能力。从整个要求分析,到数据据够设计和一些算法的实现都使我对程序设计有了新的设

温馨提示

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

评论

0/150

提交评论