语法分析 自顶向下分析
一、确定的自顶向下分析思想 :
确定的自顶向下分析方法,首先要解决从某文法的开始符号出发,对给定的输入符号串如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符往下推导,或构造一棵相应的语法树,若能够推导出给定的输入符号串,或能构造出语法树其末端结点以从左向右的顺序连接正好为给定的输入符号串,则所给的输入符号串为该文法的句子。二、可选集的定义
设G=(VT,VN,S,P)是上下文无关文法, 其中A a 是文法G的一个产生式,编号为i,则可选集:
(1)Select(i)=FIRST(α),当α!=>* ε (a不能推导出空字符)
(2)Select(i)= FIRST(α)∪FOLLOW(A),当α=>* ε
三、LL(1)文法定义
(第一个L从左向右扫描字符串 第二个L生成最左推导)
设G=(VT,VN,S,P)是上下文无关文法,该文法G是LL(1)文法,当且仅当对于G的每一个非终结符A的任何两个不同产生式Aα,Aβ,在产生式中的编号分别为I和J,当且仅当下面的条件成立:Select(i)∩Select (j)= Ø, 当α, β不能同时=>* ε,能够实现确定的自顶向下语法分析。
1、计算FIRST集
(1)若X∈VT,则FIRST(X)={X}。(本身为终结符)
(2)若X∈VN,且有产生式X-> a…,则把a加入到FIRST(X)中。(推出终结符)
(3)若X->ε也是一条产生式,则把ε也加到FIRST(X)中。(推导出空串)
(4)若X->Y…是一个产生式且Y∈VN,则把FIRST(Y)中的所有非ε元素都加到FIRST(X)中;(推导出非终结符)
若X->Y1Y2…YK 是一个产生式,Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j ≤i-1,FIRST(Yj)都含有ε。
即Y1..Y(i-1) =>* ε,则把FIRST(Yj)中的所有非ε元素都加到FIRST(X)中;
特别是,若所有的FIRST(Yj , j=1,2,…,K)均含有ε,则把ε加到FRIST(X)中。
如果开始符号能推导出ε,则还需要考虑FOLLOW集
2、计算FOLLOW集
(1)对于文法的开始符号S,置#于FOLLOW(S) 中;(开始符号)
(2)若A=>*αB β是一个产生式,则把FIRST(β)-{ ε}加至FOLLOW(B)中;(后缀跟一个不能推导出空字符,加FIRST-{ ε})
(3)若A=>*αB是一个产生式,或A=>*αBβ是一个产生式而β=>* ε(即ε∈FIRST(β)),则把FOLLOW(A)加至FOLLOW(B)中.
(后缀为空,或者后缀可以推导出空字符,加FOLLOW(A))
3、计算SELECT集
根据可选集的定义,其中A α 是文法G的一个产生式,编号为i,则可选集:
①Select(i)=FIRST(α),当α!=>* ε
②Select(i)= FIRST(α)∪FOLLOW(A),当α=>* ε
四、递归子程序
1、编写文法,消除二义性,
2、改写文法(消除左递归和提取做引子)
3、求非终结符的FIRST集合FOLLOW集
4、检查是不是LL(1)文法
若不是LL(1)文法,则说明文法的复杂性超过自顶向下的分析能力
5、按照LL(1)文法画语法图
6、化简语法图
7、按照语法图,编写程序算法
五、预测分析程序模型
1、预测分析表的构造算法
1) 对于每一产生式 A→α,作 2)和3)
2) 对于 FIRST(α)中的每一终结符a, 将 A→α 填入 M[A,a]
3) 如果ε属于 FIRST(α),则将 A→α填入 FOLLOW(A)中任一元素 b 的 M[A,b];
4) 将所有无定义的 M[A,b] 标上错误标志。
2、预测分析法(状态矩阵法)
1) 编写文法,消除二义性;
2) 消除左递归、提取左因子;
3) 求 FIRST 集和 FOLLOW 集
4)检查是不是 LL(1) 文法
若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力
5) 按照 LL(1) 文法构造预测分析表
6) 实现预测分析器