一、求每一个产生式的 SELECT 集html
二、注意区分是对谁 FIRST 集 FOLLOW 集数组
三、开始符号的 FOLLOW 集包含 #htm
四、各集合对对应的对象以及含义对象
集 | 对象 | 含义 |
---|---|---|
FIRST 集 | 是对产生式右部 | 右部内部的全部终结符集,可能为 ε |
FOLLOW 集 | 是对产生式左部(非终结符) | 非终结符后面紧跟的终结符,可能为 #,和该非终结符推导出的右部无关(由于LL(1)文法不包含递归,因此右部不会再有该非终结符,因此不能经过该右部判断该非终结符后跟集合) |
SELECT 集 | 是对产生式 | 须要考虑产生式右部的不一样状况,进一步肯定是根据 FIRST 集仍是 FOLLOW 集 |
五、SELECT 集的定义
注: 注意区分 FIRST 集 FOLLOW 时是对 α 仍是 Ablog
给定文法 G,对于产生式 A→α,α ∈ V*,则可选集 SELECT(A→α) 有:
(1)若 α ≠ ε,且 α ≠+> ε,则 SELECT(A→α) = FIRST(α)
(2)若 α ≠ ε,但 α =+> ε,则 SELECT(A→α) = FIRST(α) ∪ FOLLOW(A)
(3)若 α = ε,则 SELECT(A→α) = FOLLOW(A)递归
描述:字符串
第 3 条是,当 α = ε,SELECT 集就等于左部 A 的 FOLLOW 集get
解题时,先判断是否为 ε,是则用第(3)条,不然再判断可否经过1次或屡次推出 ε,是则用第(2)条,不然用第(1)条编译
求 FIRST,FOLLOW,SELECT 集详细例题可参考:
《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法table
六、LL(1) 分析表的结构
分析表是一个二维数组 M[A,a],其中 A 表示行,是非终结符,a 表式列是终结符或 #。
七、LL(1) 分析表构造方法:
已给文法:
G[S]: S→aH
H→aMd
H→d
M→Ab
M→ε
A→aM
A→e
(1)求 SELECT 集
(2)证实文法是 LL(1) 文法
(3)构造 LL(1) 分析表
解析:
求 SELECT 集:
产生式 | FIRST 集 | FOLLOW 集 | SELECT 集 |
---|---|---|---|
S→aH 分析: 对该产生式,可知 FIRST(aH) = {a};也可知应将 FOLLOW(S) = {#} 加到 FOLLOW(H) 中 | {a} | FOLLOW(S) = {#} | SELECT(S→aH) = FIRST(aH) = {a} |
H→aMd 分析: 对该产生式,可知 FIRST(aMd) = {a};也可知应将 d 加到 FOLLOW(M) 中 | {a} | FOLLOW(H) = {#} | SELECT(H→aMd) = FIRST(aMd) = {a} |
H→d 分析: 对该产生式,可知 FIRST(d) = {d} | {d} | SELECT(H→d) = FIRST(d) = {d} | |
M→Ab 分析: 对该产生式,可知 FIRST(Ab) = {a, e};也可知应将 b 加到 FOLLOW(A) 中 | {a, e} | FOLLOW(M) = {b, d} | SELECT(M→Ab) = FIRST(Ad) = {a, e} |
M→ε | {ε} | SELECT(M→ε) = FOLLOW(M) ={d, b} 求法: 由产生式 H→aMd,因此将 d 放入 FOLLOW(M);由产生式 A→aM 因此把 FOLLOW(A) 加至 FOLLOW(M) 中。同理 求 FOLLOW(A),由产生式 M→Ab,FOLLOW(A) = {b}。故 FOLLOW(M) = {d ,b} | |
A→aM 分析: 对该产生式,可知 FIRST(aM) = {a};也可知应将 FOLLOW(A) 加到 FOLLOW(M) 中 | {a} | FOLLOW(A) = {b} | SELECT(A→aM) = FIRST(aM) = {a} |
A→e 分析: 对该产生式,可知 FIRST(e) = {e} | {e} | SELECT(A→e) = FIRST(e) = {e} |
证实文法是 LL(1) 文法(2 分)
定理:同一非终结符的 SELECT 交集为空集,则该文法是 LL(1) 文法:
SELECT(H→aMd) ∩ SELECT(H→d) = ∅
SELECT(M→Ab) ∩ SELECT(M→ε) = ∅
SELECT(A→aM) ∩ SELECT(A→e) = ∅
因此该文法是 LL(1) 文法
构造 LL(1) 分析表(1 分)
分析表是一个二维数组 M[A,a],其中 A 表示行是非终结符,a 表式列是终结符或 #。根据 SELECT 集构造分析表:
a | b | d | e | |
---|---|---|---|---|
S | S→aH | |||
H | H→aMd | H→d | ||
M | M→Ab | M→ε | M→ε | M→Ab |
A | A→aM | A→e |