Parsing 这个语法怎么是LR(1)而不是SLR(1)?

Parsing 这个语法怎么是LR(1)而不是SLR(1)?,parsing,grammar,conflict,context-free-grammar,lr,Parsing,Grammar,Conflict,Context Free Grammar,Lr,我有以下语法,听说是LR(1),但不是SLR(1): S:=aa|bac | d c | b d a A:=d 我不明白这是为什么。如何证明这一点?解决这一问题的一种方法是尝试为语法构造LR(1)和SLR(1)解析器。如果我们在这样做的过程中发现任何移位/减少或减少/减少冲突,我们可以证明语法不属于这些语言类别之一 让我们从SLR(1)解析器开始。首先,我们需要计算语法的LR(0)配置集。这里可以看到: (1) S -> .aA S -> .bAc S -> .dc S -&g

我有以下语法,听说是LR(1),但不是SLR(1):

S:=aa|bac | d c | b d a

A:=d


我不明白这是为什么。如何证明这一点?

解决这一问题的一种方法是尝试为语法构造LR(1)和SLR(1)解析器。如果我们在这样做的过程中发现任何移位/减少或减少/减少冲突,我们可以证明语法不属于这些语言类别之一

让我们从SLR(1)解析器开始。首先,我们需要计算语法的LR(0)配置集。这里可以看到:

(1)
S -> .aA
S -> .bAc
S -> .dc
S -> .bda

(2)
S -> a.A
A -> .d

(3)
S -> aA.

(4)
A -> d.

(5)
S -> b.Ac
S -> b.da
A -> .d

(6)
S -> bA.c

(7)
S -> bAc.

(8)
S -> bd.a
A -> d.

(9)
S -> bda.

(10)
S -> d.c

(11)
S -> dc.
接下来,我们需要获得所有非终结符的以下集合。如下所示:

FOLLOW(S) = { $ }
FOLLOW(A) = { $, c }
鉴于此,我们可以返回并将LR(0)配置集升级为SLR(1)配置集:

(1)
S -> .aA    [ $ ]
S -> .bAc   [ $ ]
S -> .dc    [ $ ]
S -> .bda   [ $ ]

(2)
S -> a.A    [ $ ]
A -> .d     [ $, c ]

(3)
S -> aA.    [ $ ]

(4)
A -> d.     [ $, c ]

(5)
S -> b.Ac   [ $ ]
S -> b.da   [ $ ]
A -> .d     [ $, c ]

(6)
S -> bA.c   [ $ ]

(7)
S -> bAc.   [ $ ]

(8)
S -> bd.a   [ $ ]
A -> d.     [ $, c ]

(9)
S -> bda.   [ $ ]

(10)
S -> d.c    [ $ ]

(11)
S -> dc.    [ $ ]
有趣的是,这里没有冲突!唯一可能的移位/减少冲突处于状态(8),但此处没有冲突,因为移位操作打开了
a
,减少操作打开了
$
。因此,这个语法实际上是SLR(1)。由于任何SLR(1)语法也是LR(1),这意味着该语法同时是SLR(1)和LR(1)


希望这有帮助

我没有足够的声誉来评论上述答案,而且我回答这个问题有点晚了,但是

我在其他地方看到过这种语法的例子,这篇文章实际上是打错了字。应该是:

S:=AA | bAc | d c | b d A

A:=d

i、 例如,S的第一个子句是“AA”,而不是“AA


在本例中,A的follow集合为{$,A,c},状态8中存在SLR冲突。

我考虑编写一个web应用程序来确定CFG的first-and-follow集合以及LR(0)、SLR(1)和LR(1)表。这会让你很容易尝试

但幸运的是,我首先在谷歌上搜索,发现这样一个工具已经存在(我不一定期望如此)。您可以在此处找到该工具:

它需要以下格式的输入:

S -> a A | b A c | d c | b d a.
A -> d.
使用这个工具,我验证了其他人已经说过的:所讨论的语法是SLR(1)。(就此问题,我给-1分)

在Toby Hutton建议的修改之后,它不再是SLR(1),而是LR(1)。

1)给定的语法在自顶向下的语法分析中是LL(1),在自下而上的语法分析中是LALR(1)

2) 当您创建解析表时,并且解析表没有多个条目,那么语法倾向于使用LALR(1)

3) 如果您的解析表有多个条目(我指的是冲突发生),那么该语法称为SLR(1)

4) 语法被称为LR(1),因为它的解析表或ACTION/GOTO表没有冲突,我们都知道在LR(1)中发生冲突时,我们合并数据并获得LALR

LR(0)或SLR或SLR(1)相同

LR(1)或CLR相同

LALR或LALR(1)是相同的

(1)参数定义语法分析器的内部生成效率类型


谢谢。

如果你想在计算机行业谋得一份职业,你需要在不懂的时候学会阅读。仔细阅读关于LR语言的维基百科,并解决这个问题。如果凝视它并理解它需要一些时间,那么就这样吧;这是典型的。谢谢,你帮了我大忙!以一种粗暴的方式,是:-}请注意,每个语法SLR(1)都是LR(1)语法,但并非所有LR(1)都是SLR(1)语法。如果您正在寻找一个示例,您可以使用以下语法:
1)S–>XX 2)X–>aX 3)X–>b
@templatetypedef,如果它是bda呢。[$]在第8州。是否会减少冲突?因为我们只有一个通用的跟随符号。@Zephyr是的,$symbol上会有一个reduce/reduce冲突。请记住,一组lookaheads的功能是“在这些符号中的任何一个上减少”,因此两个lookahead集之间的任何冲突都是一个问题。@templatetypedef先生,如果您能回答这个问题,那就太好了。$不在该语法的fo(a)中,但没有它,S/R冲突仍然存在。