一、自顶向下 (top-down) 分析方法
读取一个 (先行) 语素,即可确定匹配哪一条语法规则。
-
1、递归下降分析法
算法构造简单,依据语法图或扩展BNF文法。大多采用手工方法,如之前我们的 elan 项目。实际中大量使用。
-
2、预测分析法
大多采用 LL(1),即:从左向右,最左推导,1个先行符号。为了自动处理的需要,采用表驱动。自动工具如 LLGen。
文法支持右递归,不支持左递归。
二、自底向上 (bottom-up) 分析方法
读取一个 (先行) 语素,还不能确定匹配哪一条语法规则,该语素放到分析栈中 (shift, 移进),在分析栈顶的语素足够多时再去匹配语法规则 (reduce,归约)。
大多采用 LR(1),即:从左向右,最右推导,1个先行符号。
算法构造复杂,实际中编译程序难以用纯手工构造,而是采用自动工具如 yacc/bison 辅助构造。
文法支持左递归、右递归和一般递归。比自顶向下方法更为强大。
三、移进和归约
自底向上分析也称移进-归约分析。
-
1.移进 (shift)
读入的语素(符号)不马上处理,而是移进(shift)到分析栈里。
-
2.归约 (reduce)
待到栈顶中的若干符号匹配某个文法规则的右端时,该串符号替换为该规则的左端。