进行自上而下的语法分析,基于文法是LL(1)文法。分为递归下降的分析和预测分析。
提取左公因子
对产生式组
A
→
α
∣
α
b
1
∣
α
b
2
∣
…
∣
α
b
m
∣
γ
1
∣
γ
2
∣
…
∣
γ
p
A \rightarrow \alpha | \alpha b_1 | \alpha b_2 | \ldots | \alpha b_m | \gamma_1 | \gamma_2 | \ldots | \gamma_p
A→α∣αb1∣αb2∣…∣αbm∣γ1∣γ2∣…∣γp
用如下产生式组替换
A
→
α
A
′
∣
γ
1
∣
γ
2
∣
…
∣
γ
p
A \rightarrow \alpha A ^ { \prime } \left| \gamma _ { 1 } \right| \gamma _ { 2 } | \ldots | \gamma _ { p }
A→αA′∣γ1∣γ2∣…∣γp
A
′
→
ε
∣
b
1
∣
b
2
∣
…
∣
b
m
A ^ { \prime } \rightarrow \varepsilon | b _ 1| b _ 2 | \dots | b _ { \mathrm { m } }
A′→ε∣b1∣b2∣…∣bm
消除左递归
对产生式组
A
→
A
α
1
∣
A
α
2
∣
⋯
∣
A
α
n
∣
β
1
∣
β
2
∣
…
∣
β
m
A \rightarrow A \alpha _ { 1 } | A \alpha _ { 2 } | \cdots | A \alpha _ { n } | \beta _ { 1 } | \beta _ { 2 } | \ldots | \beta _ { m }
A→Aα1∣Aα2∣⋯∣Aαn∣β1∣β2∣…∣βm
用如下产生式组替换
A
→
β
1
A
′
∣
β
2
A
′
∣
…
∣
β
m
A
′
A \rightarrow \beta _ { 1 } A ^ { \prime } | \beta _ { 2 } A ^ { \prime } | \ldots | \beta _ { m } A ^ { \prime }
A→β1A′∣β2A′∣…∣βmA′
A
′
→
α
1
A
′
∣
α
2
A
′
∣
…
∣
α
n
A
′
∣
ε
A ^ { \prime } \rightarrow \alpha _ { 1 } \mathrm { A ^ { \prime } } | \alpha _ { 2 } \mathrm { A ^ { \prime } } |\ldots | \alpha _ { \mathrm { n } } \mathrm { A ^ { \prime } } | \varepsilon
A′→α1A′∣α2A′∣…∣αnA′∣ε
Tips: 消除左递归并非一定产生等价的LL(1)文法。
S
→
A
a
∣
b
,
A
→
S
B
,
B
→
a
b
S\rightarrow Aa \mid b, A\rightarrow SB, B\rightarrow ab
S→Aa∣b,A→SB,B→ab
- 如果把A的产生式代入S的产生式得到等价文法是LL(1)的。
- 如果把S的产生式代入A的产生式得到等价文法不是LL(1)的。
LL(1)文法
第一个L代表从左到右扫描输入串,第二个L代表最左推导,1表示分析的每一步只需向前查看一个符号。
LL(1)文法具有无二义性、无左公因子、无左递归的性质。对于文法的任何非终结符,使用它匹配输入串时,能够根据所面临的输入符号准确的选择产生式,如果该产生式匹配成功,那么这个匹配不是虚假匹配,如果该产生式匹配不成功,则用其他的产生式也一定不会匹配成功。
判断一个文法是否是LL(1)文法
对于文法中的任何两个产生式 A → α ∣ β A\rightarrow\alpha\mid\beta A→α∣β,满足:
- FISRT( α \alpha α) ⋂ \bigcap ⋂FISRT( β \beta β)= ∅ \varnothing ∅
- 如果 β ⇒ ∗ ε \beta\Rightarrow^*\varepsilon β⇒∗ε,那么 F I S R T ( α ) ⋂ F O L L O W ( β ) = ∅ FISRT(\alpha)\bigcap FOLLOW(\beta)=\varnothing FISRT(α)⋂FOLLOW(β)=∅
非递归分析预测分析表的构建
- 对文法的每个产生式 A → α A\rightarrow\alpha A→α,执行第二步和第三步。
- 对FIRST( α \alpha α)的每个终结符a,把 A → α A\rightarrow\alpha A→α加入 M[A, a](即加入表中A行a列)。
- 如果 ε \varepsilon ε在FIRST( α \alpha α)中,对FOLLOW(A)的每个终结符b(包括$), 把 A → α A\rightarrow\alpha A→α加入M[A, b]。
- M的其它没有定义的条目都是error。