Análise SemânticaTopAnálise SintácticaSintaxe Abstracta

Sintaxe Abstracta

Princípios

Descida Recursiva: Semântica

Descida Recursiva: Semântica

int F_follow[] = {PLUS,TIMES,RPAREN,EOF,-1};
int F(void) { switch (tok) {
  case ID: {int i=lookup(tokval.id);
            advance(); return i;}
  case NUM:{int i=tokval.num;
            advance(); return i;}
  case LPAREN: eat(LPAREN); {int i=E();
            eatOrSkipTo(RPAREN, F_follow);
            return i;}
  default: printf("expected ID, NUM, (");
           skipto(F_FOLLOW); return(0);
}}

int T_follow[] = {PLUS,RPAREN,EOF,-1};
int T(void) { switch (tok) {
  case ID: case NUM: case LPAREN:
          return Tprime(F());
  default: ....
}}

int Tprime(int a) {switch(tok) {
  case TIMES: eat(TIMES);return Tprime(a*F());
  case PLUS: case RPAREN; case EOF: return a;
  default: ....
}}

YACC: Semântica

%{ yylex e yyerror }%
%union {int num; string id;}
%token <num> INT
%token <id> ID
%type  <num> exp
%start exp

%left PLUS MINUS
%left TIMES
%left UMINUS
%%

exp : INT           {$$ = $1;}
    | exp PLUS exp  {$$ = $1+$3;}
    | exp MINUS exp {$$ = $1-$3;}
    | exp TIMES exp {$$ = $1*$3;}
    | MINUS exp % prec UMINUS {$$ = -$2;}

YACC: Semântica

YACC: Execução

Árvores Abstractas de Parse

Árvores Abstractas: Implementação

Árvores Abstractas: Exemplo

prog: stm                      {$$=$1}

stm : stm SEMICOLON stm  
                  {$$=A_CompoundStm($1,$3);}
stm : ID ASSIGN exp            
                  {$$=A_AssignStm($1,$3);}
stm : PRINT LPAREN exps RPAREN 
                  {$$=A_PrintStm($3);}

exps: exp         {$$=A_ExpList($1,NULL);}
exps: exp COMMA exps
                  {$$=A_ExpList($1,$3);}

exp: INT          {$$=A_NumExp($1);}
exp: ID           {$$=A_IdExp($1);}
exp: exp PLUS exp {$$=A_OpExp($1,A_plus,$3);}
exp: exp MINUS exp
                  {$$=A_OpExp($1,A_minus,$3);}
exp: exp TIMES exp
                  {$$=A_OpExp($1,A_times,$3);}
exp: exp DIV exp  {$$=A_OpExp($1,A_div,$3);}
exp: stm COMMA exp
                  {$$=A_EseqExp($1,$3);}
exp: LPAREN exp RPAREN
                  {$$=$1;}

Recuperação de Erros


vitor@cos.ufrj.br

Análise SemânticaTopAnálise SintácticaSintaxe Abstracta