簡體   English   中英

計算語法的 FIRST 和 FOLLOW 集?

[英]Computing FIRST and FOLLOW sets for a grammar?

我必須計算以下語法的 FIRST 和 FOLLOW 集:

S -> ABC
A -> a | Cb | 1
B -> c | dA | 1
C -> e | f

但是,我不完全確定我是否理解如何做到這一點。 根據我的理解,我得到以下計算:

FIRST(S)= {a, e, f, b, c, d}
FIRST(A)= {a, e, f, 1}
FIRST(B)= {c, d, a, e, f, b, 1}
FIRST(C)= {e, f}

FOLLOW(S)= {$}
FOLLOW(A)= {c, d, a, e, f, b}
FOLLOW(B)= {e, f}
FOLLOW(C)= {$}

這樣對嗎? 我錯過了什么? 如果是這樣,請有人解釋我錯過了什么以及我將如何計算正確的 FIRST 和 FOLLOW 集? 另外,通過查看生成的集合,我如何判斷它是否是 LL(1) 語法?

當 S(目標非終結符)展開時,其派生中的第一個終結符必須僅來自 A,因為這正是 S->ABC 中語法所指示的。 (除非你的語法中的“1”表示 epsilon,一個空的右邊;在這種情況下,我們繼續到 B 並找到 B 的第一個集合。)A 可以直接擴展到 a 和 1,並通過 C 擴展到 e 和 f . 所以第一組 S 是 a,1,e,f(所有這些終端的並集)。 語法看起來是 LL(1),因為每個實際標記似乎決定了在推導的每個步驟中使用哪個右側。 計算所有 FIRST 集以確認此猜測。 如果同一個終結符在同一個非終結符 LHS 的兩個 RHS 的 FIRST 集合中,則文法不是 LL(1),因為該終結符會導致在推導中選擇使用哪個產生式時產生歧義。 LL(1) 文法必須是明確的,並且每個非終結符都有一個非空的 FIRST 條目,這意味着文法沒有左遞歸。

請注意,不需要 FOLLOW 集,因為沒有右側為空的產生式(此類產生式可用於在 LL(1) 文法中對 LL(2) 語言進行建模,但會增加解析器的復雜性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM