我正在準備期中考試,所以我發現了一些問題并試圖解決它。
但我的答案與給定的答案不同
問題:
Consider The Following Grammar, Which Generates Email Addresses:
Addr → [email protected]
Name → id | id.Name
This grammar, as written, is not LL(1). Rewrite the grammar to eliminate all LL(1) conflicts.
問題要求我們消除 LL(1) 沖突據我了解,它可以通過左分解來消除。
因此,我的回答是
Addr → [email protected]
Name → idName'
Name' → epsilon | .Name
但是,給出的答案是
Addr → [email protected]
Name → idName'
Name' → epsilon | .idName'
我的理解有什么不對嗎?感謝這篇文章中的任何建議。
謝謝
uj5u.com熱心網友回復:
據我所知,您的解決方案和您作為給定答案顯示的解決方案都不是 LL(1)。然而,給出的答案更準確地反映了左分解程序。您的解決方案留下了 artefact Name -> id Name',現在沒有任何用處;將語法擴展Name到其唯一的產生式消除了不必要的推導步驟。(實際上,您可以以相同的方式消除 的兩個實體Name。)
但是如果問題是要你想出一個 LL(1) 語法,那么給定的答案是行不通的。
取一個簡單的地址 ,[email protected]并想象決議器一直運行到 之后example,即id. 在這一點上,決議器期待一個Name',它要么是空的,要么是以 開頭的東西.。(在您的語法中,something is'.' Name在您參考的解決方案中,它是'.' id Name,但無論哪種方式,預期的下一個標記都是.。)因此決議器需要在空產生式和以 a 開頭的產生式之間做出決定.。由于前瞻是.,決議器當然可以選擇以.. 但是選擇空生產呢?在這種情況下,下一個標記將匹配第二個Namein之后的任何內容Addr -> Name @ Name . id,這也是一個.. 換句話說,看著.,決議器有兩個明顯有效的選項:空產生式或以 . 開頭的產生式.。無論是使用您的語法還是解決方案的語法,都是如此。
最簡單的解決方案(不是很通用)是重新排列Addr規則。Addr希望在 之后至少有兩個ids @,這也可以通過以下方式實作:
Addr -> Name @ id . Name
你仍然需要左因素來完成這項作業,但現在's FOLLOW setName沒有問題;Name它后面不能再跟 a .,后面的決定example是強制的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529586.html
標籤:解析二
