簡體   English   中英

確定以下CFG組

[英]Determining FOLLOW sets of CFG

此頁面上 ,作者解釋了如何確定CFG的FOLLOW集。 在標題“ 語法分析目標:關注集合”下,他指出:

進行追蹤的步驟

約定:a,b和c表示終端或非終端。 a *表示零個或多個終端或非終端(可能兩者)。 a +代表一個或多個... D是非末端的。

  1. 將輸入結束標記($)放入開始規則的跟隨集中。
  2. 假設我們有一個規則R→a * Db。 First(b)中的所有內容(ε除外)都添加到Follow(D)中。 如果First(b)包含ε,則Follow(R)中的所有內容都將放入Follow(D)。
  3. 最后,如果我們有規則R→a * D,則Follow(R)中的所有內容都將放在Follow(D)中。
  4. 終端的跟隨集為空集。

到現在為止還挺好。 但是在該項目下面的框中,我們讀到:

[...]規則1的步驟2(N→V = E)表示first(=)在Follow(V)中。

現在,這是我不了解的部分。 當他說First(=)在Follow(V)中時,他顯然將=映射到b,將V映射到D(第一個框中的乘積來自b和D)。 但是(a*)(D)(b)()(V)(=)E不匹配。

我是不是完全看錯了,還是作者可能寫a*Db而不是a*Dba*

(特別是如果您在Wikipedia上閱讀:“項I [A→α•Bβ,x]的FOLLOW(I)是可以在非終端B后面出現的終端集合,其中α,β是任意符號字符串,並且x是一個任意的超前終端。”)

是的,他的意思是:

R → a* D b*

並且由於b*可以是零個符號(即ε),因此不需要第二條規則。 請記住, FIRST是在任意符號序列上定義的。

換句話說,適用於:

A → α B β

  1. FIRST(β)每個終端都在FOLLOW(B) ,並且
  2. 如果β ⇒* ε ,則FOLLOW(A)所有內容都在FOLLOW(B)

這是Aho,Sethi和Ullman在龍書中所說的:

形式上,我們說LR(1)[A → α·β, a]如果存在推導,則對可行的前綴γ 有效
S ⇒* δAw ⇒ δαβw
其中γ = δαaw的第一個符號或w是ε且a$

(上面的標記為rm ,表示right-most derivation ;換句話說,在每個派生步驟中,最右邊的非終端用其乘積之一替換。因此, w僅包含終端。)

換句話說,如果我們已經到達某個點,我們決定A可能是下一個約簡,而a可能跟在A ,則LR(1)項是有效的 (可能適用); 在解析的當前點,我們已經讀取了α。 因此, 如果 a遵循β,則可以減小。 我們還不知道,除非β是空序列,但是我們需要記住這一事實,以防發現β可以得出空序列。

希望對您有所幫助。 這里很晚了,我太累了,無法再次檢查。 明天吧...

暫無
暫無

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

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