Carregar apresentação
A apresentação está carregando. Por favor, espere
1
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/
2
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/
3
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/
4
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/
5
Exemplo – função e( ) DEI /* E T E’ */ e( ) { t( ); e2( ); }
Jorge Morais LFA 1999/
6
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/
7
Exemplo – função t( ) DEI /* T F T’ */ t( ) { f( ); t2( ); }
Jorge Morais LFA 1999/
8
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/
9
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/
10
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/
11
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/
12
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/
13
Exemplo – função listaexpr( )
DEI /* ListaExpr Expr ListaExpr’ */ listaexpr( ) { expr(); listaexpr2(); } Jorge Morais LFA 1999/
14
Exemplo – função listaexpr2( )
DEI /* ListaExpr’ , Expr ListaExpr’ | */ listaexpr2() { if(token = = VIRG){ token = next_token(); expr( ); listaexpr2( ); } Jorge Morais LFA 1999/
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.