语法分析
实验原理
语法分析的主要任务是“组词成句”,将词法分析给出的单词序列按语法规则构成更大的语法单位,如“程序、语句、表达式”等;或者说,语法分析的作用是用来判断给定输入串是否为合乎文法的句子。
按照语法分析树的建立方法,我们可以粗略地把语法分析办法分为两大类,一类是自下而上分析法,另一类是自上而下分析法。自上而下分析法就是从文法的开始符号出发,向下推导,推出句子,它不允许文法含有任何左递归。自下而上分析法则是从输入串开始,逐步进行“归约”,直到归约到文法的开始符号;或者说,从语法树的末端开始,步步向上“归约”,直到根结。
本实验设计一个自上而下的预测分析程序。预测分析法(LL(1)方法)的基本思想是:从文法开始符S出发,利用分析表和分析栈,从左到右扫描源程序,每次通过向前查看一个符号,选择合适的产生式,生成句子的最左推导。
对实验内容的理解与说明
语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子。即判断从文法开始符号出发,能否推导出这个输入串。从概念上讲,就是要建立一颗与输入串相匹配的语法分析树。
本次实验需要设计一个基于LL(1)方法的自上而下语法分析器。当一个文法不含左递归、每个非终结符A的各个产生式的候选首符集两两不相交、对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则FIRST(A)∩FOLLOW(A) = Φ,那么该文法称为LL(1)文法。LL(1)中的第一个L表示从左到右扫描输入串,第二个L表示最左推导,1表示分析时每一步需要向前查看一个符号。实现LL(1)分析,需要使用一个分析表和一个栈。因此,需要先根据所输入的文法构造一个分析表。而构造预测分析表,需要先计算所有非终结符的FIRST集和FOLLOW集。
程序功能与框架
本节主要描述实验所设计的语法分析程序的主要功能及总体框架、存储结构、变量说明和算法思路等内容。程序总体框架主要描述程序功能和程序的模块划分、主要功能模块之间的关系。存储结构主要描述输入、输出、主要变量的存储方式以及所采用的数据结构。变量说明主要对主要变量的功能进行描述。算法思路部分将结合程序流程图进行说明。
总体架构
本实验编程实现了一个LL(1)文法的语法分析器,对于用户输入的文法和Token序列,能够完成以下功能:
根据用户输入的写有文法内容的文件,读取并构造一个文法的非终结符集合、终结符集合、文法开始符号、规则集合。
对于构造出的文法,能够计算并输出其非终结符的FIRST集、FOLLOW集。
利用FIRST集和FOLLOW集,构造该文法的预测分析表并输出。
利用预测分析表,能够对用户输入的Token序列进行语法分析,并输出分析过程。
该语法分析程序大致可分为五个模块:文法输入模块、文法处理模块、Token流输入模块、语法分析模块、输出模块。
存储结构
程序使用一个文法类来存储文法对象,对于每个输入的文法,都会构造出一个该文法类的对象。该文法类的数据成员有:文法开始符号S、文法的终结符集合VT、文法的非终结符集合VN、文法的规则(产生式集合)、文法所对应的预测分析表、非终结符的FIRST集、非终结符的FOLLOW集。各数据成员的数据结构如下表所示。
变量说明
算法思路
程序总体流程
First集的计算过程
Follow集的计算过程
预测分析表的构造过程
预测分析主控程序
