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文法