编译原理 自底向上语法分析

引言

自底向上的语法分析相当于从叶子节点开始向上一直到根部构造一棵语法树。我们将使用移入-归约法完成这一过程。

归约

  • 定义:一个与某产生式体相匹配的特定子串被替换成该产生式头部的非终结符号。相当于反向的最右推导。

举例:

给定文法:S->aABe
A->Abc | b
B->d

串abbcde可以由推导S=>rmaABe=>rmaAde=>rmaAbcde=>rmabbcde得到。
那么逆置最后一步,把b替换成非终结符A就是归约,并且称这个b为句柄。

  • 句柄:如果有S->αAb->αβb,那么紧跟α的产生式A->β是αβb的一个句柄。非正式地讲,β就是句柄。这里要满足的重要条件就是从句柄继续逆推一定能得到开始符号。如果不能构成一个以开始符号为起点的推导,那么这样的产生式不能构成句柄。

仍按上例:abbcde的句柄为b,aAbcde的句柄为Abc,等等。

句柄右侧的串只含终结符号,因为如果含有非终结符号,那必然不是最右推导。在有二义性的文法中不是唯一的,这很好理解,因为产生式不是唯一的。

移入-归约分析法

四种动作:
• 移进 (shift):把下一个输入符号移进栈 (栈顶)
• 归约 (reduce):分析器知道句柄的右端已在栈顶,然后确定句柄的左端在栈中的位置,再决定用什么样的非终结符代替句柄
• 接受 (accept):分析器宣告分析成功
• 报错 (error):分析器发现语法错误,调用错误恢复例程

只要恰当地进行以上四种操作,就能完成语法树的构建。我们先看一个手工构建的例子。
已知以下文法:E->E + T | T
T->T * F | F
F->(E) | id
用移入-归约语法分析器构建语法树。
在这里插入图片描述
栈内加入结束符,然后逐个字符移入,在正确的时候归约,最后得到开始符。这里的问题是:
1、何时移入,何时归约?
2、选择哪个子串进行归约?
3、进行归约时,选择哪个产生式进行归约?
看起来,我们又需要一个像非递归的自顶向下分析法的预测分析表的东西。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值