自底向上分析法不存在要进行消除左递归和左公共因子。一般编译器中大多使用这种语法分析。
首先,要解决的第一个问题是,自底向上递归的顺序。
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所对应的分析表中的状态压入状态栈中。依次循环,知道符号栈为空。