语法和语义分析
5
2 向前看集 Follow
定义 设文法G[S],非终结符号U的向前看集为 Follow(U)={a︱S * …Ua…, a∈ Vt∪{#}}
即Follow(U)为所有含有U的句型中紧跟在U之 后的终结符号或#组成的集合。 (若紧跟在非终结符号U后面的符号串为空时 ,则视U后面的符号为特殊符号#)
从语法树建立的角度来看,它是根据文法从树根结
点开始,试着自上而下建立一棵语法树,其末端结点
按从左到右的顺序若是给定的句子,则句子得到识别,
表明其结构符合文法,否则不符合文法。
14
文法G[N]:N→D︱ND D→0︱1︱2︱…︱9
分析25是否符合该文法 N
ND D5 2
15
2 自顶向下分析的难点及解决办法
16
对于某个非终结符号有n个规则(n个候选式), 此时要分两种情况 I 首符号不相同
10
例: 文法G[E] E→TE’
E’→+E︱є T→FT’ T’→T︱є F→PF’ F’→*F’︱є P→(E)︱a︱b︱∧
First(E)= First(T)= First(F)= First(P)={(,a,b,∧}
First(E’)={+,є } First(F’)={*,є }
First(T’)={(,a,b,∧,є }
6
例: 文法G[E]:E→E+T︱T
T→T*F︱F F→(E)︱i
E * E
E * E+T Follow(E)={#,+,)}
E * (E)
E * T
E * T+T E * T*F E * (T)
Follow(T)={#,*,+,)}Follow(F)=来自#,*,+,)}7
3 可选集 Select
难点1: 若文法中有如U→x1︱x2︱…︱xn 此时很难确定应用哪一条规则进行替换
解决办法: 把文法中每个非终结符号A的右部称为A的候选式
对文法的每个规则A→求可选集 First(),当不为空符号串
Select( A→)= Follow(A),当为空符号串
当不为空符号串,若当前输入符号a,
有a∈First(),则可选用规则A→进行推导
Follow(E)= Follow(E’)={),# }
E→TE’ 把FIRST(E’)- є加入FOLLOW(T) E’→є FOLLOW(E)加入FOLLOW(T)中。
Follow(T)= Follow(T’)={),+,# } T→FT’ 把FIRST(T’)- є加入FOLLOW(F)
T’→є FOLLOW(T)加入FOLLOW(F)中。
Follow(F)= Follow(F’)={),+,#,(,a,b,∧ }
Follow(P)= {*,),+,#,(,a,b,∧ }
13
6.2 句子的分析
一 自顶向下分析
1 自顶向下分析思想
推导
从推导的角度来看,它是从文法的开始符号出发,根
据文法试着建立一个推导序列,若得到所给的句子,则
句子得到识别,表明其结构符合文法,否则不符合文法
9
例: 文法G[E]:S→aBc︱bB
B→bB︱d ︱ є
Sellect(S→aBc)= First(aBc)={a} Sellect(S→bB)= First(bB)={b} Sellect(B→bB)= First(bB)={b} Sellect(B→d)= First(d)={d} Sellect(B→ є )= Follow(B)={#,c}
2
6.1 常用的终结符号集 1 首符号集First 2 向前看集Follow 3 可选集Select
3
1 首符号集First
定义 设文法G[S],字汇表为V,则符号串的首符号集为 First()={a︱ * ay,a∈Vt,y∈V* } 即First()是的所有可能推导的开头终结符或 可能的є。
若为空符号串,则有First()=(空集)
若→є,则є∈First()
4
例:文法G[E]:E→TE’
E’→+TE’︱є T→FT’ T’→*FT’︱є F→(E)︱i
则有 E * T * F* (E)︱i
First (E)=First (T)=First (F)={( , i } First(E’)={+, є } First(T’)={*, є } First(i+i)={i}
定义 设文法G[S],并有规则A→(为符号串) 则该规则的可选集为
Select(A→)=
First(),当不为空符号串 Follow(A),当为空符号串
非ε规则,求β的First,ε规则求A的Follow
8
例:文法G[E]:E→E+T︱T
T→T*F︱F F→(E)︱i
Sellect(E→E+T)= First(E+T)={(,i} Sellect(E→T)= First(T)={(,I } Sellect(T→T*F)= First(T*F)={(,i} Sellect(T→F)= First(F)={(,i} Sellect(F→(E))= First((E))={(} Sellect(F→i)= First(i)={i}
第五六章 语法和语义分析
语法分析是编译程序的核心部分,其主要任务 是确定语法结构,检查语法错误,报告错误的性质
和位置,并进行适当的纠错工作.
语义分析的主要任务是分析语法结构含义, 表示成中间语言或生成目标指令.
语法分析的方法有多种多样,常用的方法有递归子程序 方法、运算符优先数法、状态矩阵法、LL(K)方法和 LR(K)方法。归纳起来,大体上可分为两大类,即自 顶向下分析方法和自底向上分析方法.
Follow(E)= Follow(E’)={),# }
11
对每一文法符号X ∈VN,计算FOLLOW(X)
①S为文法的开始符号,则把#加入FOLLOW(S) ②若X→B,则把FIRST() - є加入FOLLOW(B) ③若X→B,若* є,则把FOLLOW(X)加入 FOLLOW(B)中。
12
例:
文法G[E] E→TE’ E’→+E︱є T→FT’ T’→T︱є F→PF’ F’→*F’︱є P→(E)︱a︱b︱∧
First(E)= First(T)= First(F)= First(P)={(,a,b,∧}
First(E’)={+,є }
First(F’)={*,є }
First(T’)={(,a,b,∧,є }