繁体   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