Algorithm LR、SLR和LALR解析器之间的区别是什么?
LR、SLR和LALR解析器之间的实际区别是什么?我知道SLR和LALR是LR解析器的类型,但就它们的解析表而言,实际的区别是什么 如何显示语法是LR、SLR还是LALR?对于LL语法,我们只需要证明解析表的任何单元格都不应该包含多个产生式规则。LALR、SLR和LR有类似的规则吗 例如,我们如何显示语法Algorithm LR、SLR和LALR解析器之间的区别是什么?,algorithm,parsing,compiler-construction,grammar,Algorithm,Parsing,Compiler Construction,Grammar,LR、SLR和LALR解析器之间的实际区别是什么?我知道SLR和LALR是LR解析器的类型,但就它们的解析表而言,实际的区别是什么 如何显示语法是LR、SLR还是LALR?对于LL语法,我们只需要证明解析表的任何单元格都不应该包含多个产生式规则。LALR、SLR和LR有类似的规则吗 例如,我们如何显示语法 S --> Aa | bAc | dc | bda A --> d 是LALR(1)而不是SLR(1) 编辑(ybungalobill):对于LALR和LR之间的区别,我没有得
S --> Aa | bAc | dc | bda
A --> d
是LALR(1)而不是SLR(1)
编辑(ybungalobill):对于LALR和LR之间的区别,我没有得到令人满意的答案。因此,LALR的表较小,但它只能识别LR语法的子集。有人能详细说明一下LALR和LR的区别吗?LALR(1)和LR(1)足以回答问题。它们都使用1个令牌前瞻,并且都是表驱动的!它们有什么不同?SLR、LALR和LR解析器都可以使用完全相同的表驱动机器来实现 从根本上说,解析算法收集下一个输入标记T,并参考当前状态S(以及相关的先行、转到和缩减表)以决定要执行的操作:
- SHIFT:如果当前表表示在令牌T上进行SHIFT,则该对(S,T)被推送到解析堆栈上,状态根据GOTO表对当前令牌(例如GOTO(T))的说明进行更改,提取另一个输入令牌T’,并重复该过程
- 减少:每个状态都有0、1或许多可能在该状态中发生的减少。如果解析器是LR或LALR,则将对照前瞻集检查令牌,以获取状态的所有有效缩减。如果令牌与语法规则G=R1 R2.的缩减的先行集匹配。。Rn,发生堆栈缩减和移位:调用G的语义动作,堆栈弹出n次(从Rn开始),将对(S,G)推到堆栈上,新状态S'设置为GOTO(G),循环使用相同的标记T重复。如果解析器是SLR解析器,对于该状态,最多有一个约简规则,因此可以盲目地执行约简操作,而无需搜索以查看哪个约简适用。对于SLR解析器来说,了解是否存在缩减是很有用的;这很容易判断每个州是否明确记录了与之相关的减少数量,而且实际上L(AL)R版本也需要该计数
- 错误:如果移位和减少都不可能,则声明语法错误
作为一个著名的例子,C++被认为是非常难解析的。通过做LALR分析的人。使用GRR机器解析C++的方法非常简单,使用了后面提供的规则。
S → L = R | R
L → * R | id
R → L
S → L•= R
R → L•
S → b d•a / $
A → d• / c