分的合先 可看出GOTO表中所有关于终结符的状态转换都与 ACTION表中的移进操作对应,因此可将相应的列合并 得到下面的分析表(关于V符的状态转换仍然保留): 状态 ACTION GOTO 实际的分析表往 a 5/m/12/往是稀疏的,可 E 采用更紧凑的格 式存储。 3 r 6 6
6 分析表的合并 可看出,GOTO表中所有关于终结符的状态转换都与 ACTION表中的移进操作对应,因此可将相应的列合并, 得到下面的分析表(关于VN符的状态转换仍然保留): 状态 ACTION GOTO a b , # L E 0 s3 s4 1 2 1 acc 2 s5 r2 3 r3 r3 4 r4 r4 5 s3 s4 6 2 6 r1 实际的分析表往 往是稀疏的,可 采用更紧凑的格 式存储
LR分器的作程 1.分析开始时,首先将初始状 态S及#压入栈; SS1S2…Sm 2设在分析的某一步分析栈#X1X2Xm32+12…1,# 和余留输入串处于格局 用Sma查 ACTION表,并根据指示完成相应的动作,分析 动作有移进归约报错接受四种 (1)移进Sk:表明句柄尚未在栈顶形成,正期待继续移进 输入符号a以形成句柄,并且移入后状态转移到Sk,故 将a和S压入栈,格局如下 S.S,S. Sms I #X12…Xma1a+1a1+2…an#
7 LR分析器的工作过程 1. 分析开始时,首先将初始状 态S0及#压入栈; 2. 设在分析的某一步,分析栈 和余留输入串处于格局: S0S1S2…Sm # X1X2…Xm aiai+1ai+2…an# 用Sm,ai查ACTION表,并根据指示完成相应的动作,分析 动作有移进,归约,报错,接受四种: (1)移进sk:表明句柄尚未在栈顶形成,正期待继续移进 输入符号ai以形成句柄,并且移入后状态转移到Sk ,故 将ai和Sk压入栈,格局如下: S0S1S2…SmSk # X1X2…Xmai ai+1ai+2…an#
LR分新器的三作越程续 (2)归约r:其中r表示按P的第j产生式A→Xmk+1Xmk+2Xm 进行归约这表明栈顶部的符号串Xmk1Xmk2符号) 是当 前句型的句柄将栈顶符号串Xmk+Xmk+2 从栈顶退出,再将A压入栈此时的格局为 m-k #X1X2…Xm:Aa:a+1a+2…,an# 再以(SmkA)查GOTO表,得S将S压入栈得到格局 #XIX.X A 1ai+2 a,#
8 LR分析器的工作过程(续) (2)归约rj:其中rj表示按P的第j产生式A→Xm-k+1Xm-k+2Xm 进行归约;这表明栈顶部的符号串Xm-k+1Xm-k+2Xm是当 前句型的句柄. 将栈顶符号串Xm-k+1Xm-k+2Xm(k个符号) 从栈顶退出,再将A压入栈,此时的格局为 S0S1S2…Sm-k # X1X2…Xm-kA aiai+1ai+2…an# 再以(Sm-k ,A)查GOTO表,得Sk ,将Sk压入栈,得到格局: S0S1S2…Sm-rSk # X1X2…Xm-rA aiai+1ai+2…an#
LR分器的已作程统) ●(3)若 ACTION(Smna)-=“acc”,则表明当前输入串已被成功地 分析完毕结束; (4)若 ACTION(Sm,a)= ERROR,则表明当前输入串有语法 错误转入出错处理程序 3.重复步骤2的工作,直到分析的某步的格局为 其中Z为文法的开始符号,Sz是使 ACTION(S2#)=“acc 的唯一状态
9 LR分析器的工作过程(续) (3)若ACTION(Sm,ai )=“acc” ,则表明当前输入串已被成功地 分析完毕,结束; (4)若ACTION(Sm,ai )=“ERROR” ,则表明当前输入串有语法 错误,转入出错处理程序; 3. 重复步骤2.的工作,直到分析的某步的格局为: S0SZ # Z # 其中,Z为文法 的开始符号, SZ是使ACTION(SZ ,#)=“acc” 的唯一状态