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

引言

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

归约

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

举例:

给定文法: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张图片
栈内加入结束符,然后逐个字符移入,在正确的时候归约,最后得到开始符。这里的问题是:
1、何时移入,何时归约?
2、选择哪个子串进行归约?
3、进行归约时,选择哪个产生式进行归约?
看起来,我们又需要一个像非递归的自顶向下分析法的预测分析表的东西。

你可能感兴趣的:(编译原理)