簡體   English   中英

在遞歸下降解析器中計算語法產生的預測集的方法

[英]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僅包含ε


筆記:

  1. 我使用的通用約定是,大寫字母( A ...)表示非終結符,小寫字母( a ...)表示語法符號(終結符或非終結符)和希臘字母( α ...)指可能為空的語法符號序列。

  2. 除了第一步已預測開始符號外,當前預測始終包含多個符號。 因此,如果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.

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