这个语法LR怎么样而不是SLR?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个语法LR怎么样而不是SLR?相关的知识,希望对你有一定的参考价值。

我有以下语法,我被告知是LR(1)而不是SLR(1):

S :: = a A | b A c | d c | b d a

A :: = d

我不明白为什么会这样。你会怎么证明这一点?

答案

我没有足够的业力来评论上面的答案,我对这个问题有点迟,但......

我在其他地方看过这个语法就是一个例子,OP实际上是一个错字。它应该是:

S :: = A a | b A c | d c | b d a

A :: = d

即,S的第一个条款是'A a',而不是'a A'。

在这种情况下,为A设置的FOLLOWS是{$,a,c},并且状态8中存在SLR冲突。

另一答案

解决这个问题的一种方法是尝试为语法构造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集。这显示在这里:

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上,而reduce在$上。因此,这个语法实际上是SLR(1)。由于任何SLR(1)语法也是LR(1),这意味着语法是SLR(1)和LR(1)。

希望这可以帮助!

另一答案

我考虑过编写一个web-app来确定CFG的第一组和后续组以及LR(0),SLR(1)和LR(1)表。这样可以让你轻松地尝试一下。

但幸运的是我先搜索了一下,发现这样的工具已经存在(我不一定认为这是这种情况)。你可以在这里找到这个工具:

http://smlweb.cpsc.ucalgary.ca/

它期望输入格式如下:

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?的主要内容,如果未能解决你的问题,请参考以下文章

语法分析 作业4 LR SLR编译原理

编译原理之语法分析-自下而上分析

编译原理之语法分析-自下而上分析

LR、SLR 和 LALR 解析器有啥区别?

编译原理-第四章 语法分析-4.6 简单LR技术

LL,LR,SLR,LALR,LR对比与分析