自下而上语法分析方法:
自下而上语法分析方法,就是从输入串开始,逐步归约,直至归约到文法的开始符号。
各种不同的自下而上分析法的共同特点是,边输入单词符号,边归约。核心问题是,识别可归约串。
对于规范归约,要清楚短语,直接短语,最左直接短语的含义。对于一个从开始符号推导出来的句型,短语由非终结符推导来,直接短语由非终结符一步推导出来的,最左直接短语是语法树中最左分支。一个句型的最左直接短语称为该句型的句柄。
一、移进-归约法
这种方法的大致意思是:用一个寄存符号的先进先出后进栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选
式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
例如:设文法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每一个产生式的右部添加一个圆点称为G的一个LR(0)项目。能够把识别活前缀的NFA确定化,使之成为一个以项目集合为状态的DFA,这个DFA就是建立LR分析算法的基础。构成识别一个文法活前缀的DFA的项目集的全体称为这个文法的LR(0)项目集规范族。
构造识别该文法所有活前缀的NFA
(1)求出该文法的LR(0)项目
(2)构造识别文法的NFA为
M= (S, ∑, f, S0, Z)
其中
S={s|s是文法G的18个LR(0)项目}
∑={S’,E, A, B,a, b, c, d}
S0= S¢→·E