[英]What is the closure of a left-recursive LR(0) item with epsilon transitions?
[英]LR(1) item sets for left recursive grammar
我閱讀了幾篇關於創建 LR(1) 項集的論文,但沒有一篇與左遞歸文法有關,例如用於解析表達式的文法。 如果我有以下語法,
E -> E + T | T
T -> T * F | F
F -> (E) | NUMBER
我 go 如何創建 LR(1) 項集?
左遞歸本質上不是 LR(1) 解析器的問題,無論您的語法是否左遞歸,確定配置集和前瞻的規則都是相同的。
在您的情況下,我們首先使用新的開始符號擴充語法:
S -> E
E -> E + T | T
T -> T * F | F
F -> (E) | NUMBER
我們的初始配置集對應於使用$
的前瞻性查看生產S -> E
。 最初,這為我們提供了以下內容:
(1)
S -> .E [$]
我們現在需要擴展 E 可能是什么。 這給了我們這些新項目:
(1)
S -> .E [$]
E -> .E + T [$]
E -> .T [$]
現在,讓我們看看項目E ->.E + T [$]
。 我們需要擴展E
在這里可能是什么,這樣做的規則與非左遞歸情況相同:我們列出E
的所有產生式,前面有一個點,並通過以下內容給出前瞻性產生式E
E ->.E + T [$]
中的 E。 在這種情況下,我們正在尋找具有+
前瞻性的E
,因為這就是生產中的內容。 這增加了這些項目:
(1)
S -> .E [$]
E -> .E + T [$]
E -> .T [$]
E -> .E + T [+]
E -> .T [+]
從這里開始,我們擴展了T
之前有一個點的所有情況,它給出了以下內容:
(1)
S -> .E [$]
E -> .E + T [$]
E -> .T [$]
E -> .E + T [+]
E -> .T [+]
T -> .T * F [$]
T -> .F [$]
T -> .T * F [+]
T -> .F [+]
我們現在必須在T ->.T * F [$]
的上下文中擴展T
s,我們通過列出 T 的所有產生式以及T
在T ->.T * F [$]
T
緊隨其后的內容來實現T ->.T * F [$]
(即*
)。 這給了我們以下內容:
(1)
S -> .E [$]
E -> .E + T [$]
E -> .T [$]
E -> .E + T [+]
E -> .T [+]
T -> .T * F [$]
T -> .F [$]
T -> .T * F [+]
T -> .F [+]
T -> .T * F [*]
T -> .F [*]
從這里我們將擴展在F
之前有一個點的產品。 根據目前的情況,您是否知道如何做到這一點?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.