Parsing 这个语法怎么是LR(1)而不是SLR(1)?
我有以下语法,听说是LR(1),但不是SLR(1): S:=aa|bac | d c | b d a A:=dParsing 这个语法怎么是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)解析器。如果我们在这样做的过程中发现任何移位/减少或减少/减少冲突,我们可以证明语法不属于这些语言类别之一 让我们从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冲突仍然存在。