簡體   English   中英

左遞歸文法的 LR(1) 項集

[英]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 的所有產生式以及TT ->.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.

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