编译原理——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
    评论
本程序的所用的存储结构都是string类型的,最主要的存储文法的数据结构为自定义结构,里面包括一个产生式的左部,右部以及select合,至于终结符的first和follow合,则是定义了一个string类型的数组进行存储。 本程序的求first,follow,select合的算法即为书上所介绍的方法,即求first的合时,只看本产生式,求follow合时,要进行递归查找一个终结符的所有后跟字符,求select其实就是对first与follow合的运算,最终根据所有的select合,便可以判断文法是否为LL(1)文法。 对于不是LL(1)文法的产生式,本程序在判断后进行转换,先进行消除左递归,然后提取左公因子,在这两步的每一步结束之后,都要对产生式进行整合,去掉空存储,去掉无法到达的产生式,将select全部置空。 每进行一次LL(1)到LL(1)的转换之后,都要对其文法性质进行判断,如果是LL(1),则跳出,不是则继续,但是当循环一定次数之后仍不是,程序判定其无法转换,也要跳出。 其中还有对第一个终结字符的右部替换与否进行选择,原因是,有些通过替换就可以很方便的进行转换,这个要通过人为进行输入。 提取公因子中也有上一段所说的类似的判断机制,目的是为了防止文法的左公因子无法提取完的情况出现。 最终有三种结果,一种是是LL(1)文法,一种是不是LL(1),但是经过转换变成了LL(1),还有一种是经过转换也无法变成LL(1)。 输入文本格式样例: A A->ad A->Bc B->aA B->bB

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值