[英]Method to calculate predict set of a grammar production in recursive descent parser
我先理解然后跟隨,但是我對預測的設定完全迷失了。 有人可以向我解釋如何使用第一和第二集合來尋找語法中的預測集嗎? 我沒有提供語法,因為這是針對家庭作業的,我想知道如何針對特定的語法而不是怎么做。
從直覺上講,產量A → α
的預測集[注1]是終端符號集,如果要預測產量,則可能是下一個要讀取的符號。 (這意味着已經預測了生產的非終端生產( A
),並且解析器現在必須確定要預測哪個非終端的生產。)
顯然,這包括可能是右側第一個符號的所有終端符號。 但是,如果右側可能派生出ε,即空字符串呢? 在這種情況下,輸入中的下一個符號將是預測的非終結符A
之后的第一個符號。 換句話說,它將成為FOLLOW(A)
的成員。 因此,預測集包含可能從右側α
開始的終端,以及如果α
可以得出空字符串,則加上FOLLOW(A)
所有符號。 [筆記2]
更正式地說, PREDICT(A → α)
為:
ε ∉ FIRST(α)
FIRST(α)
則為ε ∉ FIRST(α)
(FIRST(α) ∪ FOLLOW(A)) - {ε}
如果ε ∈ FIRST(α)
請記住,我們通過“瀏覽”ε來以句子形式計算FIRST
:
FIRST(aβ)
是
FIRST(a)
如果ε ∉ FIRST(a)
(FIRST(a) - {ε}) ∪ FIRST(β)
如果ε ∈ FIRST(a)
因此,如果右側的每個符號都可以為空,則右側的FIRST
僅包含ε
。
我使用的通用約定是,大寫字母( A
...)表示非終結符,小寫字母( a
...)表示語法符號(終結符或非終結符)和希臘字母( α
...)指可能為空的語法符號序列。
除了第一步已預測開始符號外,當前預測始終包含多個符號。 因此,如果A
是要擴展的下一個非終結符,並且我們看到它是可為空的(即它不能派生任何東西),則我們實際上不需要查找FOLLOW(A)
因為我們可以僅查看預測堆棧並查看我們所預測的將遵循A
在某些情況下,這可能使我們避免與A
的其他替代方法之一發生沖突。
但是,無論如何都使用FOLLOW(A)
是正常的。 始終使用FOLLOW(A)
通常被稱為“ Strong LL”(SLL)算法。 盡管似乎計算已知預測堆棧的FIRST集比使用預先計算的FOLLOW集更強大,但它實際上並沒有提高LL解析的能力; 每個非LL語法都可以轉換為SLL語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.