若已构造出某文法的LR(1)项目集族C。 C={I0,I1,…,In}其中Ik的k为分析器的状态,则动作ACTION表和状态转换GOTO表构造方法如下: (1) 若项目[A→α·aβ,b]属于Ik,且GO(Ik,a)=Ij,其中a∈VT,则置ACTION[k,a]=Sj。其Sj的含义是把输入符号a和状态j分别移入文法符号栈和状态栈。 (2) 若项目[A→α·,a]属于Ik,则置ACTION[k,a]= rj 其中a∈VT,rj 的含义为把当前栈顶符号串α归约为A(即用产生式A→α归约)。j为在文法中对产生式A→α的编号。 (3) 若项目[S′→S·,#]属于Ik,则置ACTION[k,#]="acc",表示"接受"。 (4) 若GO(Ik,A)=Ij,其中A∈VN,则置GOTO[k,A]=j。表示转入j状态,置当前文法符号栈顶为A,状态栈顶为j。 (5) 凡不能用规则(1)~(4)填入分析表中的元素,均置"报错标志"。本教材中用"空白"表示。 根据上述规则,我们对7.4例中文法的LR(1)项目集族构造其相应的LR(1)分析表如表7.10。 LR(1)分析表的构造除 (2) 外,其余同LR(0)或SLR(1)。即 若项目[A→α·,a]属于Ik,则置ACTION[k,a]= rj。也就是归约时向前查看的符号为向前搜索符。 |