[英]Determining FOLLOW sets of CFG
在此頁面上 ,作者解釋了如何確定CFG的FOLLOW集。 在標題“ 語法分析目標:關注集合”下,他指出:
進行追蹤的步驟
約定:a,b和c表示終端或非終端。 a *表示零個或多個終端或非終端(可能兩者)。 a +代表一個或多個... D是非末端的。
- 將輸入結束標記($)放入開始規則的跟隨集中。
- 假設我們有一個規則R→a * Db。 First(b)中的所有內容(ε除外)都添加到Follow(D)中。 如果First(b)包含ε,則Follow(R)中的所有內容都將放入Follow(D)。
- 最后,如果我們有規則R→a * D,則Follow(R)中的所有內容都將放在Follow(D)中。
- 終端的跟隨集為空集。
到現在為止還挺好。 但是在該項目下面的框中,我們讀到:
[...]規則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 β
FIRST(β)
每個終端都在FOLLOW(B)
,並且 β ⇒* ε
,則FOLLOW(A)
所有內容都在FOLLOW(B)
。 這是Aho,Sethi和Ullman在龍書中所說的:
形式上,我們說
LR(1)
項[A → α·β, a]
如果存在推導,則對可行的前綴γ 有效
S ⇒* δAw ⇒ δαβw
其中γ = δα
且a
是w
的第一個符號或w
是ε且a
是$
。
(上面的⇒
標記為rm
,表示right-most derivation
;換句話說,在每個派生步驟中,最右邊的非終端用其乘積之一替換。因此, w
僅包含終端。)
換句話說,如果我們已經到達某個點,我們決定A
可能是下一個約簡,而a
可能跟在A
,則LR(1)
項是有效的 (可能適用); 在解析的當前點,我們已經讀取了α。 因此, 如果 a
遵循β,則可以減小。 我們還不知道,除非β是空序列,但是我們需要記住這一事實,以防發現β可以得出空序列。
希望對您有所幫助。 這里很晚了,我太累了,無法再次檢查。 明天吧...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.