文档介绍:第四章自顶向下的语法分析
School puter Science & Technology
Harbin Institute of Technology
重点:自顶向下分析的基本思想,预测分析器总体结构,预测分析表的构造,递归下降分析法基本思想,简单算术表达式的递归下降分析器。
难点:FIRST 和 FOLLOW 集的求法,对它们的理解以及在构造LL(1)分析表时的使用。递归子程序法中如何体现分析的结果。
2017/11/11
2
第4章  自顶向下的语法分析
语法分析概述
自顶向下的语法分析面临的问题
与文法的改造
预测分析法
递归下降分析法
本章小结
2017/11/11
3
语法分析的功能和位置
语法分析(syntax analysis)是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。
语法分析器在编译器中的位置
2017/11/11
4
语法分析概述
递归子程序法
自顶向下
预测分析法(LL(1))
算符优先分析法
自底向上
LR(0)、SLR(1)、LR(1)、LALR(1)
Top Down
Bottom Up
从文法产生语言的角度
从自动机识别语言的角度
从根开始,逐步为某语句构造一棵语法树
相反,将一句子归约为开始符号
问题:解决确定性问题!
假定文法是压缩的:即删除了单位产生式和无用产生式。
2017/11/11
5
自顶向下的语法分析面临的问题与文法的改造
自顶向下语法分析的基本思想
从文法的开始符号出发,寻求所给的输入符号串的一个最左推导。
从树根S开始,构造所给输入符号串的语法树
例:设有G:S→xAy A→**|*,输入串:x**y
SxAy
x**y
S
x
A
y
*
*
2017/11/11
6
自顶向下分析面临的问题
对于文法G,如果L(G)中存在一个具有两棵或两棵以上分析树的句子,则称G是二义性的。也可以等价地说:如果L(G)中存在一个具有两个或两个以上最左(或最右)推导的句子,则G是二义性文法。
如果一个文法G是二义性的,假设wL(G)且w存在两个最左推导,则在对w进行自顶向下的语法分析时,语法分析程序将无法确定采用w的哪个最左推导。
Gexp: EE+T | E-T| T
TT*F | T/F | F
FF↑P | P
Pc | id | (E)
解决办法:改造文法,引入新的文法变量
2017/11/11
7
自顶向下分析面临的问题
文法中每个语法变量A的产生式右部称为A的候选式,如果A有多个候选式存在公共前缀,则自顶向下的语法分析程序将无法根据当前输入符号准确地选择用于推导的产生式,只能试探。当试探不成功时就需要退回到上一步推导,看A是否还有其它的候选式,这就是回溯(backtracking)。
Ge:ET EE+T EE-T TF TT*F TT/F F(E) Fid
例如:考虑为输入串id+id*id建立最左推导
2017/11/11
8
自顶向下分析面临的问题
ET ()
ETF ()
ETF(E) ()
ETFid ()
ETT*F ()
............
,以便减少推导过程中回溯现象的发生,当然,单纯通过提取左因子无法彻底避免回溯现象的发生。
2017/11/11
9
自顶向下分析面临的问题
假设A是文法G的某个语法变量,如果存在推导A αAβ,则称文法G是递归的,当α=ε时称之为左递归;如果A αAβ至少需要两步推导,则称文法G是间接递归的,当α=ε时称之为间接左递归;如果文法G中存在形如AαAβ的产生式,则称文法G是直接递归的,当α=ε时称之为直接左递归。
Ger:ET EE+T EE-T TF TT*F TT/F F(E) Fid
考虑为输入串id+id*id建立一个最左推导
EE+TE+T+TE+T+T+T……
2017/11/11
10
对上下文无关文法的改造
改造的方法就是通过引入新的语法变量等,使文法含有更多的信息。其实,许多二义性文法是由于概念不清,即语法变量的定义不明确导致的,此时通过引入新的语法变量即可消除文法的二义性。
<stmt>→ if <expr> then <stmt>
|