编译原理——First集、Follow集、LL(1)填表、左递归/非LL(1)文法改写、LL(1)文法判断

编译原理——First集、Follow集、LL(1)填表、左递归/非LL(1)文法改写、LL(1)文法判断

First集

可能有3种产生式:
A → a B C A \to aBC AaBC
A → ε A \to \varepsilon Aε
A → B C D a A \to BCDa ABCDa

解决方法:
① 以终结符开头

直接将终结符添加到 F i r s t ( A ) First(A) First(A)

② 只有 ϵ \epsilon ϵ

e p s i l o n epsilon epsilon添加到 F i r s t ( A ) First(A) First(A)

③ 以非终结符开头

(1) 若 ε   ∉   F i r s t ( B ) \varepsilon\ \notin \ First(B) ε / First(B),将 F i r s t ( B ) First(B) First(B)添加到 F i r s t ( A ) First(A) First(A)中;
(2) 若 ε   ∈   F i r s t ( B ) \varepsilon\ \in \ First(B) ε  First(B),则将 F i r s t ( B ) ∪ F i r s t ( C ) First(B)\cup First (C) First(B)First(C)添加到 F i r s t ( A ) First(A) First(A)中;
(3) 若 ε   ∈   F i r s t ( C ) \varepsilon\ \in \ First(C) ε  First(C),则将 F i r s t ( B ) ∪ F i r s t ( C ) ∪ F i r s t ( D ) First(B)\cup First (C)\cup First(D) First(B)First(C)First(D)添加到 F i r s t ( A ) First(A) First(A)中;
(4) 若 ε   ∈   F i r s t ( D ) \varepsilon\ \in \ First(D) ε  First(D),则将 F i r s t ( B ) ∪ F i r s t ( C ) ∪ F i r s t ( D ) ∪ { a } First(B)\cup First (C)\cup First(D)\cup \{a\} First(B)First(C)First(D){a}添加到 F i r s t ( A ) First(A) First(A)中。

总结:

(1) 以终结符或 ε \varepsilon ε开头,将终结符或 ε \varepsilon ε添加到 F i r s t ( A ) First(A) First(A)中。
(2) 以非终结符或开头,产生式形如 A → A 1 A 2 . . . A n a b . . . z A\to A_1A_2...A_nab...z AA1A2...Anab...z,若 A 1 A 2 . . . A m ( m ≤ n ) A_1A_2...A_m(m\leq n) A1A2...Am(mn)中的每个非终结符的 F i r s t First First集均包含 ε \varepsilon ε,则将 F i r s t ( A 1 ) ∪ F i r s t ( A 2 ) ∪ . . . ∪ F i r s t ( A m + 1 First(A_1)\cup First (A_2)\cup ... \cup First(A_{m+1} First(A1)First(A2)...First(Am+1添加到 F i r s t ( A ) First(A) First(A)中(此处 a = A n + 1 a=A_{n+1} a=An+1

Follow集

产生式:
A → B C D a A \to BCDa ABCDa
A → B C D A \to BCD ABCD

解决方法:
① 以终结符结尾:

(1) 若 ε   ∉   F i r s t ( C ) \varepsilon\ \notin \ First(C) ε / First(C)并且 ε   ∉   F i r s t ( D ) \varepsilon\ \notin\ First(D) ε / First(D),则将 F i r s t ( C ) First(C) First(C)添加到 F o l l o w ( B ) Follow(B) Follow(B)中,将 F i r s t ( D ) First (D) First(D)添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 { a } \{a\} {a}添加到 F o l l o w ( D ) Follow(D) Follow(D)中;
(2) 若 ε   ∉   F i r s t ( C ) \varepsilon\ \notin \ First(C) ε / First(C)并且 ε   ∈   F i r s t ( D ) \varepsilon\ \in\ First(D) ε  First(D),则将 F i r s t ( C ) First(C) First(C)添加到 F o l l o w ( B ) Follow(B) Follow(B)中,将 F i r s t ( D ) ∪ { a } − { ε } First (D)\cup \{a\}-\{\varepsilon\} First(D){a}{ε}添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 { a } \{a\} {a}添加到 F o l l o w ( D ) Follow(D) Follow(D)中;
(3) 若 ε   ∈   F i r s t ( C ) \varepsilon\ \in \ First(C) ε  First(C)并且 ε   ∉   F i r s t ( D ) \varepsilon\ \notin\ First(D) ε / First(D),则将 F i r s t ( C ) ∪ F i r s t ( D ) − { ε } First(C)\cup First (D)-\{\varepsilon\} First(C)First(D){ε}添加到 F o l l o w ( B ) Follow(B) Follow(B)中,将 F i r s t ( D ) First (D) First(D)添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 { a } \{a\} {a}添加到 F o l l o w ( D ) Follow(D) Follow(D)中;
(4) 若 ε   ∈   F i r s t ( C ) \varepsilon\ \in \ First(C) ε  First(C)并且 ε   ∈   F i r s t ( D ) \varepsilon\ \in\ First(D) ε  First(D),则将 F i r s t ( C ) ∪ F i r s t ( D ) ∪ { a } − { ε } First(C)\cup First (D)\cup \{a\}-\{\varepsilon\} First(C)First(D){a}{ε}添加到 F o l l o w ( B ) Follow(B) Follow(B)中;将 F i r s t ( D ) ∪ { a } First (D)\cup \{a\} First(D){a}添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 { a } \{a\} {a}添加到 F o l l o w ( D ) Follow(D) Follow(D)中;

②以非终结符结尾:

(1) 若 ε   ∉   F i r s t ( C ) \varepsilon\ \notin \ First(C) ε / First(C)并且 ε   ∉   F i r s t ( D ) \varepsilon\ \notin\ First(D) ε / First(D),则将 F i r s t ( C ) First(C) First(C)添加到 F o l l o w ( B ) Follow(B) Follow(B)中,将 F i r s t ( D ) First (D) First(D)添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 F o l l o w ( A ) Follow (A) Follow(A)添加到 F o l l o w ( D ) Follow(D) Follow(D)中;
(2) 若 ε   ∉   F i r s t ( C ) \varepsilon\ \notin \ First(C) ε / First(C)并且 ε   ∈   F i r s t ( D ) \varepsilon\ \in\ First(D) ε  First(D),则将 F i r s t ( C ) First(C) First(C)添加到 F o l l o w ( B ) Follow(B) Follow(B)中,将 F i r s t ( D ) ∪ { a } − { ε } First (D)\cup \{a\}-\{\varepsilon\} First(D){a}{ε}添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 F o l l o w ( A ) Follow (A) Follow(A)添加到 F o l l o w ( D ) Follow(D) Follow(D)中;
(3) 若 ε   ∈   F i r s t ( C ) \varepsilon\ \in \ First(C) ε  First(C)并且 ε   ∉   F i r s t ( D ) \varepsilon\ \notin\ First(D) ε / First(D),则将 F i r s t ( C ) ∪ F i r s t ( D ) − { ε } First(C)\cup First (D)-\{\varepsilon\} First(C)First(D){ε}添加到 F o l l o w ( B ) Follow(B) Follow(B)中,将 F i r s t ( D ) First (D) First(D)添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 F o l l o w ( A ) Follow (A) Follow(A)添加到 F o l l o w ( D ) Follow(D) Follow(D)中;
(4) 若 ε   ∈   F i r s t ( C ) \varepsilon\ \in \ First(C) ε  First(C)并且 ε   ∈   F i r s t ( D ) \varepsilon\ \in\ First(D) ε  First(D),则将 F i r s t ( C ) ∪ F i r s t ( D ) ∪ F o l l o w ( A ) − { ε } First(C)\cup First (D)\cup Follow (A)-\{\varepsilon\} First(C)First(D)Follow(A){ε}添加到 F o l l o w ( B ) Follow(B) Follow(B)中;将 F i r s t ( D ) ∪ F o l l o w ( A ) − { ε } First (D)\cup Follow (A)-\{\varepsilon\} First(D)Follow(A){ε}添加到 F o l l o w ( C ) Follow(C) Follow(C)中,将 F o l l o w ( A ) Follow (A) Follow(A)添加到 F o l l o w ( D ) Follow(D) Follow(D)中;

LL(1)填表

产生式:
A → w A\to w Aw
A → ε A\to \varepsilon Aε

解决方法:

① 产生式右侧是一个或多个非终结符和终结符的组合。
(1) 对每一个在 F i r s t ( w ) First(w) First(w)内的终结符 t t t,设 T [ A , t ] = w T[A,t]=w T[A,t]=w
(2) 如果 ε ∈ F i r s t ( w ) \varepsilon\in First(w) εFirst(w),则对于 F o l l o w ( A ) Follow(A) Follow(A)中的每一个终结符 b b b,设 T [ A , b ] = w T[A,b]=w T[A,b]=w
(3) 如果 ε ∈ F i r s t ( w ) \varepsilon\in First(w) εFirst(w)中且$ ∈ F i r s t ( w ) \in First(w) First(w),设 T [ A , T[A, T[A,$ ] = w ]=w ]=w
② 产生式右侧是 ε \varepsilon ε
对于 F o l l o w ( A ) Follow(A) Follow(A)中的每一个终结符 b b b,设 T [ A , b ] = ε T[A,b]=\varepsilon T[A,b]=ε

消除直接左递归

形如:
P → P α ∣ β P\to P\alpha|\beta PPαβ α \alpha α β \beta β α 、 β \alpha、\beta αβ不以 P P P打头

解决方法:

(1) P → β Q P\to \beta Q PβQ
(2) Q → α Q ∣ ε Q\to \alpha Q|\varepsilon QαQε。其中, Q Q Q为新增加的非终结符。

另外的非LL(1)文法

形如:
S → E S\to E SE
E → T E\to T ET
E → T + E E\to T+E ET+E

解决方法:

S → E S\to E SE
E → T Y E\to TY ETY
Y → + E Y\to +E Y+E
Y → ε Y\to \varepsilon Yε

LL(1)文法判断

方法一:通过LL(1)表看是否有某一个矩阵元素存在两条及以上的产生式,若有则存在冲突,否则无冲突。
方法二:通过 F i r s t ( w ) ∩ F o l l o w ( A ) = ∅ First(w)\cap Follow(A)=\empty First(w)Follow(A)=判断,若为空则无冲突,否则有。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yenny�Marx?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值