LR分析法

1.基本概念

(1)LR分析器结构


(2)LR分析表

大家重点关注一下这个LR分析表,我们后续的分析都将围绕这个LR分析表展开

这其中有三种操作:
 

操作具体过程
移进(shift)把(s ,a)的下一状态s’和输入符号a推进栈,下一输入符号变成现行输入符号
归约(reduce)用某产生式A→β进行归约。假若β的长度为r,去除栈顶个项,使状态sm_变成栈顶状态,然后把下一状态s'=GOTO[sm-[,A]和文法符号A推进栈
接受(accept)宣布分析成功,停止分析器工作

就以上面的表举例,S5就代表着把5移入状态栈中,把对应的i移入符号栈中。r2就表示用第六个推导式做规约,比如说对应的规约式是A→β(一般情况这个是找出来的,比如说r2,就去找第二个推导式),就把β对应的状态栈中的数字和β一起移出栈,然后把符号栈中的β换成A,A对应的状态在GOTO表中查询,然后移入状态栈。

后面我会用更加通俗易懂的语言来解释他们具体是怎么操作的。

2.LR分析过程 

 

这里就具体介绍了他们是如何进行操作的,如果大家还不太清晰的话,可以对照我后面的例题讲解进行理解。

 3.例题讲解

这是一道LR分析法的经典例题,我们现在来看看该如何去做。

刚开始我们列出三列,分别写上 状态,符号,输入串

(1)步骤一:

 (2)步骤二:

状态为0,输入串为i,对照ACTION表进行查表,可以查到S5,将i压入符号栈中,将5压入状态栈中,我们可以得到下面的表格和生成树

(3)步骤三:

状态为0,输入串为*,对照ACTION表进行查表,可以查到r6,用第六个推导式F->进行规约,栈顶的i是一个句柄,i*i+i栈内的内容拼接起来的句柄就是这个i,将i和5弹出栈(见下图1),把规约后的符号F压入栈(见下图2),对应的状态也要压入栈(使用GOTO表,此时对应的状态为0,符号栈的栈顶为F,我们可以在GOTO表中找到状态3,将其压入栈中)

 

 (4)步骤四:

此时的状态是3,输入串的栈顶是*,我们可以找到r4,和步骤三的操作过程是一样的,这里不做详细介绍。

 

 (5)步骤五:

此时的状态是2,输入串是*,我们可以找到s7,和步骤二的操作过程是一样的,这里不做详细说明。

(6)步骤六:

直接上图

(7)步骤七

 

 

 

 (8)步骤八:

中间有很多的步骤都被我省略了,我就把所有的过程都集成在一起了,便于同学们理解。

 

 

 

 


相信同学们对例题的理解,已经对LR分析有了一个基本的概念。

3.LR文法

 

 

 

 

  • 17
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值