Parsing LALR(1)和SLR(1)解析器

Parsing LALR(1)和SLR(1)解析器,parsing,context-free-grammar,lookahead,Parsing,Context Free Grammar,Lookahead,我从我们的老师那里得到了一个假设,他想从我们那里寻找并验证它。我们有SLR(1)和LALR(1)解析器。假设是: 假设我们有一个名为X的语言结构。如果我们不能为这个结构提供LALR(1)语法,我们也不能提供SLR(1),也许LR(1)语法可以解决这个问题。但是如果我们可以为这个结构提供一个LALR(1)语法,我们也可以提供一个SLR(1) 如果你在互联网上搜索,你会发现很多网站说这种语法不是SLR(1),而是LALR(1): (“id”、“*”和“=”为终端,其他为非终端) 如果我们试图找到单反

我从我们的老师那里得到了一个假设,他想从我们那里寻找并验证它。我们有SLR(1)和LALR(1)解析器。假设是:

假设我们有一个名为X的语言结构。如果我们不能为这个结构提供LALR(1)语法,我们也不能提供SLR(1),也许LR(1)语法可以解决这个问题。但是如果我们可以为这个结构提供一个LALR(1)语法,我们也可以提供一个SLR(1)

如果你在互联网上搜索,你会发现很多网站说这种语法不是SLR(1),而是LALR(1):

(“id”、“*”和“=”为终端,其他为非终端)
如果我们试图找到单反(1)项,我们将看到移位/减少冲突。这是真的,但我的假设说明了其他一些事情。在我们的假设中,我们谈论的是由语法而不是语法本身描述的语言!我们可以删除“R”并将语法转换为LL(1),它也是SLR(1)和LALR(1):

你可以试试这个语法,你可以看到这个语法描述了与上一个语法相同的语言,并且有SLR(1)和LALR(1)语法

所以我的问题不是找到一个语法,它是LALR(1),而不是SLR(1)。互联网上有很多这样的网站。我想知道有没有语言有LALR(1)语法,但没有SLR(1)语法?如果我们的假设是真的,那么就没有必要使用LALR(1),SLR(1)可以为我们做任何事情,但是LALR(1)更容易使用,而且将来可能会有一种语言拒绝这个假设

我很抱歉英语不好。
谢谢。

每种LR(k)语言都有SLR(1)语法

中有一个证明,它提供了构造SLR(1)语法的算法,如果您有LR(k)语法并且知道k的值。不幸的是,没有算法可以明确地告诉您CFG是否为LR(k),更不用说提供k的值了。(如果你知道语法是LR(k),你可以尝试连续的k值,直到找到一个有效的。但是如果语法不是LR(k),这个过程永远不会终止。)

以上来自于,这是解决此类问题的更好地方。

每种LR(k)语言都有一个SLR(1)语法

中有一个证明,它提供了构造SLR(1)语法的算法,如果您有LR(k)语法并且知道k的值。不幸的是,没有算法可以明确地告诉您CFG是否为LR(k),更不用说提供k的值了。(如果你知道语法是LR(k),你可以尝试连续的k值,直到找到一个有效的。但是如果语法不是LR(k),这个过程永远不会终止。)

以上内容来自于,这是一个更好的回答此类问题的地方。

LR(1)>LALR(1)>SLR(1)

LR(1)的威力最大,LALR(1)的威力较小,而SLR(1)的威力最小。 这是事实,因为前瞻集的计算方式。(1) 表示对一个令牌进行前瞻。这里的语法是LR(1),但不是LALR(1),也绝对不是SLR(1):

SLR(1)解析器生成器将报告语法中非真实冲突的冲突。我说的是使用大型语法(例如C11.grm)的现实世界

SLR(1)前瞻计算过于简单,从语法中获取lookahead,而不是由LALR(1)解析器生成器创建的LR(0)状态机

这就是弗兰克·德雷默1969年关于LALR(1)的论文如此重要的原因

通过查看语法,A1后面可以跟t或n,因此这是一个冲突 由SLR(1)报告,但有一个LR(1)状态机,其中A1后面没有冲突

LR(1)>LALR(1)>SLR(1)

LR(1)的威力最大,LALR(1)的威力较小,而SLR(1)的威力最小。 这是事实,因为前瞻集的计算方式。(1) 表示对一个令牌进行前瞻。这里的语法是LR(1),但不是LALR(1),也绝对不是SLR(1):

SLR(1)解析器生成器将报告语法中非真实冲突的冲突。我说的是使用大型语法(例如C11.grm)的现实世界

SLR(1)前瞻计算过于简单,从语法中获取lookahead,而不是由LALR(1)解析器生成器创建的LR(0)状态机

这就是弗兰克·德雷默1969年关于LALR(1)的论文如此重要的原因

通过查看语法,A1后面可以跟t或n,因此这是一个冲突
由SLR(1)报告,但有一个LR(1)状态机,其中A1后面没有冲突

这可能更适合cs.stackexchange.com,但请先检查。对不起。我在stackoverflow中看到很多关于SLR(1)和LALR(1)的问题。我想我应该在这里问一下。如果我必须移动,我如何移动它?没问题。我不认为这完全是离题的,但你会得到更好的答案,因为主要是编程人员只需要一些理论上的C。我不知道如何迁移,所以可能只是手动删除并重新发布。如果迁移到(它所属的位置),问题将作为副本关闭。请看,这可能更适合cs.stackexchange.com,但请先检查。对不起。我在stackoverflow中看到很多关于SLR(1)和LALR(1)的问题。我想我应该在这里问一下。如果我必须移动,我如何移动它?没问题。我不认为这完全是离题的,但你会得到更好的答案,因为主要是编程人员只需要一些理论上的C。我不知道如何迁移,所以可能只是手动删除并重新发布。如果迁移到(它所属的位置),问题将作为副本关闭。看见
S -> R
S -> L = R
L -> * R
L -> id
R -> L
S -> LM
M -> epsilon
M -> = L
L -> * L
L -> id
   G : S... <eof>
     ;
   S : c A1 t ';'
     | c A2 n ';'                       
     | r A2 t ';'
     | r A1 n ';'
     ;
  A1 : a 
     ;
  A2 : a 
     ;
  A1 : a    => X()
     ;
  A2 : a    => Y()
     ;