第五章 语法分析——自下而上分析
5.1自下而上分析基本问题
一、移进-归约法
这种方法的大致意思是:用一个寄存符号的先进先出后进栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选
式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
例如:设文法G(S):
(1) S —> aAcBe
(2) A —> b
(3) A —> Ab
(4) B —> d
分析:首先让a进栈,然后把b进栈,根据第二条规则,把b归约成A,再让第二个b进栈,此时栈顶有Ab,根据第三条规则,将
Ab归约成A,让c进栈,d进栈,根据第四条规则,将d归约成B,最后让e进栈,此时栈里的符号为aAcBe,最后根据第一条规则
将其归约为S。
二、规范归约
定义:令G是一个文法,S是文法的开始符号,假定αβ△是文法G的一个句型
其中α,β,△∈(VN∪VT)*,A∈VN ,如果有
则称β是句型αβ△相对于非终结符A的短语。
特别是,如果有A=>β则称β是句型αβ△相对于规则A—>β的直接短语,一个句型的最左直接短语称为该句型的句柄。
注:因为句型是由开始符号推出来的,而短语是由非终结符号推出来的。所以,短语是句型的一部份或全部符号串。
考虑文法
G : E —> T | E+T
T—> F | T*F
F—> (E) | i
求证i1*i2+i3是G的一个句型,并找出该句型的全部短语、直接短语和句柄。
分析:证明i1*i2+i3是G的一个句型
E => E+T=> T+T => T*F+T => F*F+T
=> i1*F+T => i1*i2+T=> i1*i2+F
=> i1*i2+i3找i1*i2+i3的所有短语
(1)假设i1*i2+i3是一个短语
因为 E =>*E 且 E =>+i1*i2+i3
所以i1*i2+i3是句型i1*i2+i3关于E的一个短语(2)假设i1*i2是一个短语
因为 E =>*T+i3 且 T =>+i1*i2
所以i1*i2是句型i1*i2+i3关于T的一个短语(3)假设i1是一个短语
因为 E =>*F*i2+i3 且 F =>+ i1
所以i1是句型i1*i2+i3关于F的一个短语(4)假设i2是一个短语
因为 E=>*i1*F+i3 且 F=>+i2
所以i2是句型i1*i2+i3关于F的一个短语
(5)假设i3是一个短语
因为 E=>*i1*i2+F且 F=>+i3
所以i3是句型i1*i2+i3关于F的一个短语(6)假设i2+i3是一个短语
因为 E=>*i1*E不成立