文法中每一非终止符 A,结构 FOLLOW(A)算法以下:反复使用以下产生式,直至 FOLLOW 集不在增大为
止。
(1) 对于文法开始符号 S,置#于 FOLLOW(S)中
(2) 若 A→αBβ是一个产生式,则把 FIRST(β)\{ε}加到 FOLLOW(B)中。
(3) 若 A→αB 是一个产生式,或 A→αBβ且β=>ε时 (即ε∈FIRST(β))则把 FOLLOW(A)加到
FOLLOW(B)中。
(4) 反复(2)、(3),直到 FOLLOW 集不再增大为止。
在结构 FOLLOW 集算法中,将第(3)条产生式解释一下:
假如有句型…Ba…,显然 a 是 B 后随符号,a∈FOLLOW(B),而 A→αB,用它进行推导有 S=>…Aa…=>…
αBa…,于是 a 也是 B 后随符号,a∈ FOLLOW(B),即 FOLLOW(A)中后随符号全部是 FOLLOW(B)中后随
符号。
经过上面一系列讨论,我们能够找出满足结构不带回溯 LL(1)文法条件:
(1)文法不含左递归。
(2)对于文法中每一个非终止符 A 各个产生式候选首符集两两不相交。即,若 A→α
1
|α
2
|…|α
n
则 FIRST(α
i
)∩FIRST(α
j
)=Ф (i≠j)
(3)对文法中每个非终止符 A,若它存在某个候选首符集包含ε,则
FIRST(A) ∩FOLLOW(A) =Ф
假如一个文法 G 满足以上条件,则称该文法 G 为 LL(1)文法。
2.3 估计分析表结构
LL(1)分析表可用一个矩阵(或二维数组)来表示,它概括了对应文法全部信息。LL(1)分析表每
一行对应文法一个非终止符,而每一列对应一个终止符或输入结束符“#”。LL(1)分析表可用数组
M[A,a]表示,其中 A 表示非终止符(即为分析栈中符号),a 表示终止符或“#”(即为输入符号)。
数组各个入口 M[A,a]中存放着面临输入符号 a 时,所应选择 A 某条产生式,即指出目前推导所使用产
生式。数组中空白入口中应填入合适犯错子程序名或编号,即此中情况下存在语法错误。数组大小为 m
×n,其中 m 是文法中非终止符,n 是终止符数(外加一个结束符“#”)。估计分析程序对每个输入串
分析在总控程序控制之下进行。具体分析时是依据目前输入符号 a
i
和分析栈顶符号 X
j
来决定是否查 LL
(1)分析表,从而依据 LL(1)表决定所选产生式,和应该进行对应操作
[5]
。