第三章 LALR(1)的构造

首先,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分析方法的基础讲起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了构造LALR分析表,需要先构造LR(0)自动机。下面是该自动机的状态转换图: ``` 状态0: E -> .E+T E -> .T T -> .TF T -> .F F -> .F* F -> .(E) F -> .a F -> .b F -> .e E -> E.+T E -> E+.T 状态1: E -> T. T -> T.F F -> .F* F -> .(E) F -> .a F -> .b F -> .e 状态2: E -> E+.T T -> T.F. F -> F*. 状态3: E -> E+T. T -> T.F F -> .F* F -> .(E) F -> .a F -> .b F -> .e 状态4: T -> T.F. F -> F*. 状态5: F -> (E). E -> .E+T E -> .T T -> .TF T -> .F F -> .F* F -> .(E) F -> .a F -> .b F -> .e E -> E.+T E -> E+.T 状态6: F -> a. T -> .TF T -> .F F -> .F* F -> .(E) F -> .a F -> .b F -> .e E -> E.+T E -> E+.T 状态7: F -> b. T -> .TF T -> .F F -> .F* F -> .(E) F -> .a F -> .b F -> .e E -> E.+T E -> E+.T 状态8: F -> e. T -> .TF T -> .F F -> .F* F -> .(E) F -> .a F -> .b F -> .e E -> E.+T E -> E+.T ``` 然后,我们需要为每个状态构造对应的LALR(1)项集。这里只给出状态0的LALR(1)项集: ``` { E -> .E+T, { $, + } E -> .T, { $, + } T -> .TF, { $, +, * } T -> .F, { $, +, * } F -> .F*, { $, +, *, a, b, ), e } F -> .(E), { $, +, *, a, b, ), e } F -> .a, { $, +, *, a, b, ), e } F -> .b, { $, +, *, a, b, ), e } F -> .e, { $, +, *, a, b, ), e } } ``` 最后,我们可以根据LALR(1)项集构造LALR分析表。下面是完整的LALR分析表: ``` | $ | + | * | ( | ) | a | b | e | -----+-------+-------+-------+-------+-------+-------+-------+-------+ 0 | | s5 | | s4 | | s6 | s7 | s8 | 1 | acc | | | | | | | | 2 | r2 | r2 | s3 | r2 | r2 | r2 | r2 | r2 | 3 | r4 | s5 | r4 | r4 | r4 | r4 | r4 | r4 | 4 | r6 | | r6 | r6 | r6 | r6 | r6 | r6 | 5 | | s5 | | s4 | | s6 | s7 | s8 | 6 | r8 | | r8 | r8 | r8 | r8 | r8 | r8 | 7 | r9 | | r9 | r9 | r9 | r9 | r9 | r9 | 8 | r10 | | r10 | r10 | r10 | r10 | r10 | r10 | ``` 其中,s表示移进,r表示归约,acc表示接受。例如,表中第一行第二列的s5表示在状态0读入+时应该将其移进状态5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值