1、第三章 词法分析,4.5.1 预测分析程序 工作过程,任课教师:孙飞显 ,编译原理,中原工学院 计算机学院,预测分析程序提出的背景,递规下降分析程序:是实现LL(1)文法分析的途径之一。 递规下降分析器存在的问题:如果用高级语言的递规过程描述递规下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。,中原工学院 计算机学院,内容提要,预测分析程序的功能 预测分析表的定义 预测分析程序的总控程序设计算法 预测分析过程举例,中原工学院 计算机学院,1、预测分析程序的功能,功能:实现LL(1)分析的另一种有效途径 方法:使用预测分析表和堆栈进行联合控制,中原工学院 计算机学院,2、预测分析表,
2、预测分析表是一个MA,a形式的矩阵。其中A为非终结符,a是终结符或# 。 矩阵元素MA,a中存放着一条关于A的产生式,指出当A面临输入符号a时所应采用的候选;MA,a中也可能存放一个“出错标志”,指出A根本不该面临输入符号a。,中原工学院 计算机学院,预测分析表举例,LL(1) 文法,中原工学院 计算机学院,3、预测分析程序的总控程序设计,栈STACK的功能栈STACK的初始化必要的假设,中原工学院 计算机学院,栈STACK的功能,当使用预测分析程序对LL(1)文法进行分析时,要用到两种数据结构: 预测分析表:存放产生式 栈STACK:存放文法符号,中原工学院 计算机学院,栈STACK的初始化
3、,当使用预测分析程序对LL(1)文法进行分析时,要对STACK进行初始化,方法如下: 步骤1:栈底放“#” ; 步骤2:放入文法开始符号。,中原工学院 计算机学院,必要的假设,假设输入串之后总有一个“#” “#”标志输入串的结束 该假设与STACK初始化时栈底的“#”相互对应,中原工学院 计算机学院,预测分析器模型,预测分析程序的总控程序在任何时候都是按STACK的栈顶符号X和当前的输入符号a行事的。预测分析器模型如下右图所示:,中原工学院 计算机学院,总控程序的设计思想,若X = a = #,则分析成功,停止分析过程。 若X = a #,则把X从STACK栈顶弹出,让a指向下一个输入符号。,
4、中原工学院 计算机学院,总控程序的设计思想(续),若X是一个非终结符,则查看分析表M。若MX,a中有X的产生式,则把X弹出STACK,然后把产生式的右部符号串按反序逐一压栈(若右部符号为,则不压栈);若MX,a中存放着“出错标志”,则调用出错诊断程序ERROR。,中原工学院 计算机学院,句型i*i+i的预测分析过程,步骤,符号栈,输入串,所用产生式,0,#E,i*i+i#,1,#ET,i*i+i#,ETE,2,#ETF,i*i+i#,TFT,中原工学院 计算机学院,句型i*i+i的预测分析过程(续1),步骤,符号栈,输入串,所用产生式,3,4,5,#ETi,i*i+i#,Fi,#ET,*i+i
5、#,#ETF*,*i+i#,T*FT,中原工学院 计算机学院,句型i*i+i的预测分析过程(续2),步骤,符号栈,输入串,所用产生式,6,7,8,#ETF,i+i#,#ETi,i+i#,Fi,#ET,+i#,中原工学院 计算机学院,句型i*i+i的预测分析过程(续3),步骤,符号栈,输入串,所用产生式,9,10,11,#E,+i#,T,#ET+,+i#,E+TE,#ET,i#,中原工学院 计算机学院,句型i*i+i的预测分析过程(续4),步骤,符号栈,输入串,所用产生式,12,13,14,#ETF,i#,TFT,#ETi,i#,Fi,#ET,#,中原工学院 计算机学院,句型i*i+i的预测分析过程(续5),步骤,符号栈,输入串,所用产生式,15,16,#E,#,T,#,#,E,