1、第四章,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序 4.6 LL(1)分析中的错误处理,4.4 递归下降分析程序构造,前提: 文法满足LL(1)文法 实现思想: 每个非终结符对应一个递归过程,约定的数据结构和函数,IP: 输入串指示器 SYM: IP当前所指的输入符号 ADVANCE: 使IP指向下一输入符号 getsym , NextCh ERROR: 出错诊察处理程序,p74,文法 (4.2) E TEE +TE|T FTT *FT|F (E) | i,E TE,PROCEDURE E; BEGIN
2、T;E END,T FT,PROCEDURE T; BEGINF;T END,E +TE|,PROCEDURE E; IF SYM=+ THEN BEGINADVANCE;T;E END,T *FT|,PROCEDURE T; IF SYM=* THEN BEGINADVANCE;F;T END,F (E) | i,PROCEDURE F; IF SYM= i THEN ADVANCE ELSEIF SYM=( THENBEGINADVANCE;E;IF SYM=) THEN ADVANCE;ELSE ERRORENDELSE ERROR,基本架构(1) Uu1 | u2 | un,U( )
3、if (sym SELECT(Uu1) ) 处理u1else if (sym SELECT(Uu2) ) 处理u2 else ERROR ,补充,基本架构(2) 对于U的每个右部ui=x1x2xn,处理ui处理x1的程序;处理x2的程序; 处理xn的程序;如果右部为, 则不处理,基本架构(3) 对于右部中的每个符号xi,xiVTif(xi = =sym) ADVANCE; return; else ERRORxiVNxi( ) /直接调用相应的过程,基本架构(4) sx*,while symselect (sx)do x,补充例: 用递归下降分析程序进行句型分析,G: SbAABaA|Bab
4、输入串 baba#,SELECT(SbA) = bSELECT(ABaA)= a SELECT(A)= #SELECT(Bab) = a,G: SbAABaA|Bab 输入串 baba#,S,主程序,program parser begingetsym; S;If sym= #Successelsefail end,SbA,procedure S beginif sym in SELECT(SbA) /b if sym = b getsym; Aelse errorelse error end,ABaA|,procedure A beginif sym in SELECT(ABaA) /aBif sym = agetsym; A;else errorelse if sym in SELECT(A) /#else error end,Bab,procedure B beginif sym in SELECT(Bab) /aif sym = a getsym; if sym = bgetsym; else errorelse errorelse error end,*EBNF和语法图 p75,