语法分析之自底向上分析

                  自底向上分析法不存在要进行消除左递归和左公共因子。一般编译器中大多使用这种语法分析。

           首先,要解决的第一个问题是,自底向上递归的顺序。

         1:每次从最左短语开始归约。 最左短语称为句柄,也就是包含终结符的语法树的最小子树。

         2:将文法按照顺序编号。

         3:利用增广文法,构造分析表。

         4:按照分析表,利用栈来进行语法分析。


    一,构造分析表的方法详解。

          概念:归约项,如   S ->  a·              即点在终结符的后面的产生式。

                     移近项,如   S ->  ·aAe         即点的后面为终结符的产生式。

                     待约项 , 如  S -> ·Aa            即点的后面为非终结符的产生式。 

         构造分析表的DFA的法则,即求 closure{ S' -> ·S } 。若 S' ->·S  且 S ->Aa   则有 S ->·Aa 依次类推。构造出分析表的DFA图。

         根据得到的DFA,以状态为首列,终结符和非终结符为首行,依次填表。

         填表算法:

            对于包含归约项的状态Ik ,由终结符a经过变换得到Ik,则action[k,a]=rj。这里的j表示状态中包含的产生式在所有产生式中的顺序号。

           对于包含移进项的状态Ik ,由前一个状态Ij经过a变换到Ik,则action[j,a]=Sk 。

         

     二,在分析表之上的自底向上语法分析算法。

              状态                              符号栈                  待分析字符串                      Action             Go

                0                                      $                          abbcdc$                                S2                 

                02                                   $a                           bbcdc$                                S4      

                024                                 $ab                         bcdc$                                   R2             3

               023                                  $aA                        bcdc$                                    S6             

                 ..                                      ..                               ..                                        ..


            详解: 如果Action为Sk 则将状态k压入状态栈,且压入待分析字符串当前字符。若为Rk,则选择产生式中序号为k的产生式,按照产生式的长度弹出符号栈中相应长度的字符串,并且弹出相应长度的状态,并且将产生式的左边非终结符压入符号栈,然后将非终结符 k所对应的分析表中的状态压入状态栈中。依次循环,知道符号栈为空。











你可能感兴趣的:(编译原理笔记)