首先,LR(1)也好,SLR(1)也好,以及LALR(1)均是一种自底向顶的语法分析方法。
LALR(1)全称为lookahead-LR(1),是由LR(1)语法分析器变来的,其中L(Left Scan)表示自左向右处理输入,R(Right Reduce)表示生成最右推导,而数字1表示使用先行1个符号。不是先行符号的LR语法分析是LR(0),它在做分析决定时不考虑先行。因此,在语法分析上面,LR(0)功能并不强。SLR(1)在LR(0)基础上考虑了先行,由于先行符号的指导,SLR(1)分析功能较LR(0)强大。但SLR(1)对先行符号审查并不严格,它简单地使用规约式左部FOLLOW集充当先行符号集,因此在解决移近与规约冲突上面有较好效果,但是在处理规约-规约冲突上容易出现“假冒”问题。具体参见编译原理教材。LR(1)分析法与SLR(1)相比,采用较为严格的先行符号审查算法,功能最强。但是它生成的自动机状态较多,规模较大,实际上应用的并不多。而LALR(1)简化了LR(1),采用合并同心集方法,大大缩小了LR(1)的自动机状态规模,功能介于SLR(1)与LR(1)之间,但应用于目前的语言,已经绰绰有余。YACC就是使用这种分析方法。
在本章中,SLR(1)分析方法我们不做过多的介绍,大家如果感兴趣可以阅读相关教材。LR(0)和LR(1)是LALR(1)的基础,这里会作详细的介绍。我们还是先从自低向顶分析方法--LR分析方法的基础讲起。