算符优先文法分析 1.问题描述 基于算符优先分析法的语法分析程序 要求: (1)输入已知文法,生成文法矩阵,判断该文法是否是算符优先文法。 (2)用程序自动生成该文法的算符优先关系矩阵。 (3)对人工输入的句型或句子,分析该句型或句子是否合法,能否用已知文法推出。 (4)具有通用性。所开发的程序可适用于不同的文法和任意输入串,且能判断该文法是否为算符优先文法。 (5)有运行实例。对于输入的文法和符号串,所编制的语法分析程序应能正确判断此串是否为文法的句子,并要求输出分析过程。 2.算符优先分析法 2.1算符优先文法 定义:设有不含空串的一文法G,如果G中没有形如G>„„BC„„的产生式,其中B和C为非终结符,且对任意两个终结符a,b之间之多只有<,>,=,三种关系的一种成立,则称G是一个算符优先文法。 非终结符的FIRSTVT集合和LASTVT集合 FIRSTVT(B)={b|B→b„或B→Cb„} LASTVT(B)={b|B→„a或B→„aC} 2.2算符优先矩阵 算符优先关系矩阵,判断输入是否满足已知文法的依据。根据非终结符的FIRSTVT集合和LASTVT集合产生。 1.“=”关系 若 A→„ab„或A→„aBb„,则a=b; 2.“”关系 若 A→„aB„,对每一个b属于FIRSTVT(B),有ab; 3.“ ”关系 若 A→„Bb„,对每一个a属于 LASTVT(B),有 a b。 2.3如何规约 在分析过程中,利用分析栈存放已识别的那部分句型,而句型的其余部分由剩余输入串组成,通过比较栈顶符号和下一个输入符号之间的关系,可以判别栈顶符号是否为句柄尾符号。如果是句柄尾,则沿栈顶向下,在栈内寻找句柄头(利用 关系)。由 关系和 关系之间包括的符号串就是句柄,然后把它们弹出栈,并代之以归约后的非终结符。这样就完成了一次归约过程。 2.4算符优先分析方法的局限性 由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。 此外,通常一个适用语言的文法也很难满足算符优先文法的条件,因而致使算符优先分析法仅适用于表达式的语法分析。 3概要设计,即算法或流程图 本程序有 java面向对象的程序设计方法设计。主要类有Suanfu(界面类),Grammar,FirstLast,Table,Guiyue。 其中 Suanfu完成所有与界面相关的操作;Grammar完成文法的提取,和终结符,非终结符的识别,和初步判断输入文法的正确性;FirstLast完成非终结符 FIR...