(2) ACTIONS,al=R1(归约) 表明此时应按文法的第个产生式A→Xmk+2 进行归约。即栈顶符号串X1X2…Xn已成为当前句型的句 柄。所谓按第j个产生式归约,就是将分析栈中从顶向下的k个符 号退栈,然后将文法符号A压入符号栈中。此时分析的格局为: -k #X. X m-k A 然后以(SnA)去查状态转移表,设 GOTOISmkA=S1,则将此 新状态压入状态栈中,则有如下格局: k a: a X1…XmkA
(2) ACTION[Sm , ai ]= Rj (归约) 表明此时应按文法的第j个产生式A→ Xm-k+1Xm-k+2 …Xm 进行归约。即栈顶符号串Xm-k+1Xm-k+2 …Xm已成为当前句型的句 柄。所谓按第j个产生式归约,就是将分析栈中从顶向下的k个符 号退栈,然后将文法符号A压入符号栈中。此时分析的格局为: ↓ S0 S1… Sm-k ai ai+1…an # # X1… Xm-k A ↑ ↑ 然后以( Sm-k ,A)去查状态转移表,设GOTO[Sm-k ,A]= Sl ,则将此 新状态压入状态栈中,则有如下格局: ↓ S0 S1… Sm-k Sl ai ai+1…an # # X1… Xm-k A ↑ ↑
(3) ACTIONS,a]=acc(接受) 表明当前的输入串已被成功地分析完毕,应停止分析器的工作。 (4) ACTIONIS,a]= ERROR(空白)。 表明当前的输入串中含有错误,也应终止当前的分析工作。 转出错处理。 3.重复上述第2步的工作,直到分析栈顶出现“接受状态”或 “出错状态”为止。对接受状态,分析栈的格局为: # Z 其中Z为文法开始符号 Sn为使 ACTION[S,#=ac0唯一状态(接受状态)
(3) ACTION[Sm , ai ]=acc (接受) 表明当前的输入串已被成功地分析完毕,应停止分析器的工作。 其中Z为文法开始符号 Sα为使ACTION[Sα ,#]=acc的 唯一状态(接受状态) (4) ACTION[Sm , ai ]=ERROR(空白)。 表明当前的输入串中含有错误,也应终止当前的分析工作。 转出错处理。 3. 重复上述第2步的工作,直到分析栈顶出现“接受状态”或 “出错状态”为止。对接受状态,分析栈的格局为: ↓ S0 Sα # # Z ↑ ↑
532LR(0)分析表的构造 为了给出构造LR(0)分析表的算法,给出一些术语: 1、规范句型的活前缀 前缀:一个符号串的前缀是指该串的任意首部(包括)。 例如abc的前缀有:εab, abc abcd的前缀有:s,a, ab. abc;abd 由此可知,对于符号串α而言,其前缀的数量为|a|+1 例:有文法GS]S→ aAcBe[] A→→b[2] 这里在每条产生式后加上了产生 A→Ab[3]式的序号[当进行推导时把序号 B→→d[4 带上,以便说明问题。 对输入串 abbcde进行推导如下(最右推导): S→ aAcBe[l→aAcd[4]e[1 →aAb[3]cd4]e1]→ab[2]b[3]cd4]e[l 由此可知, abbcde是该文法的句子
5.3.2 LR(0) 分析表的构造 为了给出构造LR(0)分析表的算法,给出一些术语: 1、规范句型的活前缀 前缀:一个符号串的前缀是指该串的任意首部(包括)。 例如 abc的前缀有: ,a,ab,abc abcd的前缀有:,a,ab,abc,abcd 由此可知,对于符号串 而言,其前缀的数量为+1。 例:有文法G[S]:S→aAcBe[1] A→b[2] 这里在每条产生式后加上了产生 A→Ab[3] 式的序号[i]当进行推导时把序号 B→d[4] 带上,以便说明问题。 对输入串abbcde进行推导如下(最右推导): S aAcBe[1] aAcd[4]e[1] aAb[3]cd[4]e[1] ab[2]b[3]cd[4]e[1] 由此可知,abbcde是该文法的句子