A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

III – Análise sintáctica Parsers descendentes recursivos Parsers predictivos Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.4 –Crespo – secção.

Apresentações semelhantes


Apresentação em tema: "III – Análise sintáctica Parsers descendentes recursivos Parsers predictivos Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.4 –Crespo – secção."— Transcrição da apresentação:

1 III – Análise sintáctica Parsers descendentes recursivos Parsers predictivos Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.4 –Crespo – secção 4.3 LFA 1999/ Jorge Morais

2 Parser descendente recursivo 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 LFA 1999/ Jorge Morais

3 Parser predictivo 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) LFA 1999/ Jorge Morais

4 Exemplo E T E E + T E | - T E | T F T T * F T | / F T | F ( E ) | id LFA 1999/ Jorge Morais

5 Exemplo – função e( ) /* E T E */ e( ) { t( ); e2( ); } LFA 1999/ Jorge Morais

6 Exemplo – função e2( ) /* E + T E | - T E | */ e2( ) { if(token = = MAIS || token = = MENOS){ token = next_token( ); t( ); e2( ); } LFA 1999/ Jorge Morais

7 Exemplo – função t( ) /* T F T */ t( ) { f( ); t2( ); } LFA 1999/ Jorge Morais

8 Exemplo – função t2( ) /* T * F T | / F T | */ t2( ) { if(token = = VEZES || token = = DIV){ token = next_token( ); f( ); t2( ); } LFA 1999/ Jorge Morais

9 Exemplo – função f( ) LFA 1999/ Jorge Morais /* 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) token = next_token( ); else erro(PROD_F); }

10 Exemplo – outras funções next_token() – retorna próximo token erro(int n) { switch(n){ case F_PAR_DIR: puts(Falta parentesis direito); break; } LFA 1999/ Jorge Morais

11 Exemplo 2 Definição da chamada duma função –ChamaFunc ID ( ListaExpr ) –ListaExpr ListaExpr, Expr | Expr Eliminando a recursividade à esquerda –ChamaFunc ID ( ListaExpr ) –ListaExpr Expr ListaExpr –ListaExpr, Expr ListaExpr | LFA 1999/ Jorge Morais

12 Exemplo – função chamafunc( ) LFA 1999/ Jorge Morais /* 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); else token=next_token( ); }

13 Exemplo – função listaexpr( ) /* ListaExpr Expr ListaExpr */ listaexpr( ) { expr(); listaexpr2(); } LFA 1999/ Jorge Morais

14 Exemplo – função listaexpr2( ) /* ListaExpr, Expr ListaExpr | */ listaexpr2() { if(token = = VIRG){ token = next_token(); expr( ); listaexpr2( ); } LFA 1999/ Jorge Morais


Carregar ppt "III – Análise sintáctica Parsers descendentes recursivos Parsers predictivos Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.4 –Crespo – secção."

Apresentações semelhantes


Anúncios Google