递归下降分析算法,也称为预测分析
优点:
1).分析高效(线性时间)
2).容易实现(方便手工编码)
3).错误定位和诊断信息准确
4).被很多开源和商业的编译器所采用(如GCC 4.0, LLVM,。。。)
算法基本思想:
1).每个非终结符构造一个分析函数
2).用前看符号指导产生式规则的选择
————————————————————————————————————————————
伪代码:
parse_S()
parse_N()
parse_V()
parse_N()
parse_N()
token = tokens[i++]
if (token==s||token==t||token==g||token==w)
return;
else
error(“…”);
parse_V()
token = tokens[i++]
…// leave this part to you
summary:采用了“分治”思想
————————————————————————————————————————————
一般的算法框架:
parse_X()
token = nextToken()
switch(token)
case …: // β 11 … β 1i
case …: // β 21 … β 2j
case …: // β 31 … β 3k
…
default: error (“…”);
————————————————————————————————————————————
对算术表达式的递归下降分析:
// a first try
parse_E()
token = tokens[i++]
if (token==num)
? // E+T or T
else error(“…”);
//this is a problem
// a second try
parse_E()
parse_T()
token = tokens[i++]
while (token == +)
parse_T()
token = tokens[i++]
parse_T()
parse_F()
token = tokens[i++]
while (token == *)
parse_F()
token = tokens[i++]