III – Análise sintáctica DEI Parsers descendentes recursivos Parsers predictivos Bibliografia aconselhada: Aho, Sethi e Ullman – secção 4.4 Crespo – secção 4.3 Jorge Morais LFA 1999/2000 - 1
Parser descendente recursivo DEI Um parser descendente recursivo pode ser construído da seguinte forma: Cada variável (símbolo não terminal) do lado esquerdo duma produção corresponderá à definição duma função. Cada token (símbolo terminal) no lado direito corresponde à sua verificação e pedido de novo token ao analisador léxico Cada variável do lado direito corresponde à chamada da função correspondente Jorge Morais LFA 1999/2000 - 2
Parser predictivo DEI Um parser descendente diz-se predictivo se para cada par (variável, token) só existe uma única alternativa a considerar A eliminação da recursividade à esquerda e a factorização à esquerda permitem a definição duma gramática que permite a construção de parsers predictivos Estas gramáticas são do tipo LL(1) Jorge Morais LFA 1999/2000 - 3
Exemplo DEI E T E’ E’ + T E’ | - T E’ | T F T’ T’ * F T’ | / F T’ | F ( E ) | id Jorge Morais LFA 1999/2000 - 4
Exemplo – função e( ) DEI /* E T E’ */ e( ) { t( ); e2( ); } Jorge Morais LFA 1999/2000 - 5
Exemplo – função e2( ) DEI /* E’ + T E’ | - T E’ | */ e2( ) { if(token = = MAIS || token = = MENOS){ token = next_token( ); t( ); e2( ); } Jorge Morais LFA 1999/2000 - 6
Exemplo – função t( ) DEI /* T F T’ */ t( ) { f( ); t2( ); } Jorge Morais LFA 1999/2000 - 7
Exemplo – função t2( ) DEI /* T’ * F T’ | / F T’ | */ t2( ) { if(token = = VEZES || token = = DIV){ token = next_token( ); f( ); t2( ); } Jorge Morais LFA 1999/2000 - 8
Exemplo – função f( ) DEI /* F ( E ) | id */ f( ) { if(token= =PAR_ESQ){ token = next_token( ); e( ); if(token= =PAR_DIR) token=next_token( ); else erro(F_PAR_DIR);} else if(token = = ID) else erro(PROD_F); } Jorge Morais LFA 1999/2000 - 9
Exemplo – outras funções DEI next_token() – retorna próximo token erro(int n) { switch(n){ .............. case F_PAR_DIR: puts(“Falta parentesis direito”); break; ............... } Jorge Morais LFA 1999/2000 - 10
Exemplo 2 DEI Definição da chamada duma função ChamaFunc ID ( ListaExpr ) ListaExpr ListaExpr , Expr | Expr Eliminando a recursividade à esquerda ListaExpr Expr ListaExpr’ ListaExpr’ , Expr ListaExpr’ | Jorge Morais LFA 1999/2000 - 11
Exemplo – função chamafunc( ) DEI /* ChamaFunc ID ( ListaExpr )*/ chamafunc ( ) { if(token != ID) erro(ERR_ID); else token = next_token( ); if(token != PAR_ESQ) erro(F_PAR_ESQ); else token=next_token( ); listaexpr(); if(token != PAR_DIR) erro(F_PAR_DIR); } Jorge Morais LFA 1999/2000 - 12
Exemplo – função listaexpr( ) DEI /* ListaExpr Expr ListaExpr’ */ listaexpr( ) { expr(); listaexpr2(); } Jorge Morais LFA 1999/2000 - 13
Exemplo – função listaexpr2( ) DEI /* ListaExpr’ , Expr ListaExpr’ | */ listaexpr2() { if(token = = VIRG){ token = next_token(); expr( ); listaexpr2( ); } Jorge Morais LFA 1999/2000 - 14