第四章 自顶向下的语法分析
重点:自顶向下分析的基本思想,预测分析器总体结构,预测分析表的构造,递归下降分析法基本思想,简单算术表达式的递归下降分析器。
难点:FIRST 和FOLLOW集的求法,对它们的理解以及在构造LL(1)分析表时的使用。递归子程序法中如何体现分析的结果。
基本概念:
自顶向下分析面临的问题:
1.二义性问题
2.回溯问题
提取左因子的方法来改造文法
3.左递归引起的无穷推导问题
消除直接左递归:
A -> Aα1 | Aα2 | Aα3 | ...... | Aαn | β1 | β2 | ...... | βn
改造:
A -> β1A' | β2A' | β3A' | ...... | βnA'
A' -> α1A' | α2A' | α3A' | ...... | αnA' | ε
消除间接左递归:
采用代入法将间接左递归变为直接左递归
采用上面介绍的方法消除直接左递归
题型:
1.计算表达式文法的语法符号的FIRST集
如果是终结符号,则,FIRSTRUG(X) := {X}
如果是变量,寻找候选式第一个是否是终结符
如果第一个是一个变量则包含该变量的FIRST集合
FIRST(X) += ( FIRST(Y) - { ε } )
如果Y可以推导为 ε 则包含下一个语法变量的FIRST 集合
2.计算表达式文法的语法变量的FOLLOW集
FOLLOW(S ) := { # }
如果 A -> αBβ 则 FOLLOW(B) += FIRST(β) - { ε }
如果 A -> αB 则 FOLLOW(B) += FOLLOW(A)
如果 A -> αBβ 且 β =>(*) ε, A ≠ B 则 FOLLOW(B) += FOLLOW(A)
3.预测分析法:
1. 构造文法
2. 改造文法:消除二义性、消除左递归、提取左因子
3. 求每个候选式的FIRST集和变量的FOLLOW集
4. 检查是不是LL(1)文法
若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力,需要附加新的“信息”
5. 构造预测分析表
6. 实现预测分析器
4.错误处理:
测试:
设有如下文法G:
E =>TE’
E’ => +E |ε
T => FT’
T’ => T |ε
F => PF’
F’ => *F |ε
P => (E)| a |∧
(1) 求该文法各语法变量的FIRST集和FOLLOW集
(2) 该文法是否为LL(1)文法?若是,构造其LL(1)分析表
1.
FIRST(P) = {(, a, ∧}
FIRST(F) = FIRST(P) = {(, a, ∧}
FIRST(T) = FIRST(F) = {(, a, ∧}
FIRST(E) = FIRST(T) = {(, a, ∧}
FIRST(E‘) = {+, ε}
FIRST(F') = {*, ε}
FIRST(T') = FIRST(T) ∪ { ε } = { (, a, ∧, ε }
FOLLOW(E') = FOLLOW(E) = { ) , # }
FOLLOW(E) = FOLLOW(E') ∪ { ) } = { ), # }
FOLLOW(T) = ( FIIRST(E') - ε ) ∪ FOLLOW(T') ∪ FOLLOW(E) = { ), # , + }
FOLLOW(T') = FOLLOW(T) = { ), # , + }
FOLLOW(F') = FOLLOW(F) = { (, a, ∧, ), #. + }
FOLLOW(F) = ( FIRST(T') - { ε } ) ∪ FOLLOW(F') ∪ FOLLOW(T) = { (, a, ∧, ), #. + }
FOLLOW(P) = ( FIRST(F') - {ε} ) = {} ∪ FOLLOW(F) = { *, (, a, ∧, ), #. + }
2.
见博客:http://blog.youkuaiyun.com/hit_rxz/article/details/41651677