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