1、编译技术语法分析温故而知新任何两个产生式 A | 都满足下列条件:1、 FIRST( ) FIRST( )= 2、若 * ,那么 FIRST() FOLLOW(A) = 上下文无关文法自上而下 自下而上LL(1)文法2个函数递归下降预测分析非递归的预测分析最左推导递归的分析程序SBAABS|dBaA|bS|cS()B();A();A()if(lookahead= a|b|c )B(); S();elsematch(d);B()if(lookahead=a)match(a); A();else if(lookahead=b)match(b); S();elsematch(c);递归下降的预测分析
2、 为每一个非终结符写一个分析过程 这些过程可能是递归的递归下降的预测分析例:type simple| id| array simple of typesimple integer| char| num dotdot num递归下降的预测分析一个辅助过程void match (terminal t) if (lookahead = t) lookahead = nextToken( );else error( );递归下降的预测分析void type( ) if ( (lookahead = integer) | (lookahead = char) |(lookahead = num) )si
3、mple( );else if ( lookahead = ) match( ); match(id);else if (lookahead = array) match(array); match( ); simple( );match( ); match(of ); type( );else error( ); type simple| id| array simple of type递归下降的预测分析void simple( ) if ( lookahead = integer) match(integer);else if (lookahead = char) match(char);
4、else if (lookahead = num) match(num); match(dotdot); match(num);else error( ); simple integer| char| num dotdot num自上而下分析非递归的预测分析a + b $输入预测分析程序分析表 M输出XYZ$栈预测分析表用于驱动分析的全过程自上而下分析非终结符输 入 符 号id + * . . .E E TE E E +TE T T FT T T T *FT F F id 书上 57页表 3.1自上而下分析预测分析器接受输入 id * id + id的动作栈 输 入 输 出$E id * id
5、 + id$E TE $ET id * id + id$T FT $ETF id * id + id$F id$ETid id * id + id$一个符号被消耗* id + id$ETMatch(id)T *FT $ETF* * id + id$ Match(*)id + id$ETF 对文法的每个产生式 A ,执行 (2)和 (3)。对 FIRST()的每个终结符 a,把 A 加入 MA, a(即加入表中 A行 a列)。预测分析表的构建如果 在 FIRST()中,对 FOLLOW(A)的每个终结符 b(包括 $) , 把 A 加入 MA, b。M的其它没有定义的条目都是 error。构造预
6、测分析表对每个产生式 A FIRST()的每个 a,把 A加入 MA, aFOLLOW(A)的 b(包括 $)把 A 加入 MA, b M的其它没有定义的条目都是 error在 FIRST() NY文法 S-ACD A-a| C-c D-dFIRST(S)=a,cFIRST(A)=a, FIRST(C)=cFIRST(D)=dFOLLOW(S)=$FOLLOW(A)=cFOLLOW(C)=dFOLLOW(D)=$预测分析表的构建文法 S-ACD A-a| C-c D-d非终结符输 入 符 号a c d $SACDS-ACD S-ACDA-a A-C-cD-dERRORERRORERRORERR
7、ORERRORERRORERRORERRORERRORERRORFIRST(S)=a,cFIRST(A)=a, FIRST(C)=cFIRST(D)=dFOLLOW(S)=$FOLLOW(A)=cFOLLOW(C)=dFOLLOW(D)=$stmt if expr then stmt e_part | othere_part else stmt | expr bFIRST(stmt)=if, otherFIRST(e_part)=else, FIRST(expr)=bFOLLOW(stmt)=else, $FOLLOW(e_part)=else, $FOLLOW(expr)=then自上而下分
8、析多重定义的条目(二义文法会出现此情况)非终结符输 入 符 号other b else . . .stmt stmt other e_part e_partelse stmte_part expr expr b删除其解决二义性自上而下分析多重定义的条目非终结符输 入 符 号other b else . . .stmt stmt other e_part e_partelse stmtexpr expr bLL(1)文法的证明:构造出的分析表没有多重定义的条目总 结First集合、 Follow集合LL( 1)文法自上而下的预测分析方法构造非递归预测分析表递归下降预测分析非递归的预测分析A | 满足下列条件:1、 FIRST( ) FIRST( )= 2、若 * ,那么 FIRST() FOLLOW(A) = 编译技术语法分析大连理工大学软件学院谢谢!