11.07.2015 Views

Compiladores: PASCALjr - WWW2 - Udesc

Compiladores: PASCALjr - WWW2 - Udesc

Compiladores: PASCALjr - WWW2 - Udesc

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Backpatching para Expressões LógicasFoi acrescentado o símbolo não-terminal M, que tem como objetivo guardar o endereçoda próxima quádrupla disponível no momento em que M é empilhado (após um “&&” ou“||”).E → E 1 || E 2 {backpatching(E 1 .ListaF alse, M.quad);E.ListaT rue = merge(E 1 .ListaT rue, E 2 .ListaT rue);E.ListaF alse = E 2 .ListaF alse; }E → E 1 && E 2 {backpatching(E 1 .ListaT rue, M.quad);E.ListaT rue = E 2 .ListaF alse;E.ListaF alse = merge(E 1 .ListaF alse, E 2 .ListaF alse); }E →!E 1 {E.ListaT rue = E 1 .ListaF alse; E.ListaF alse = E 1 .ListaT rue; }E → (E 1 ) {E.ListaT rue = E 1 .ListaT rue; E.ListaF alse = E 1 .ListaF alse; }E → ID 1 opRel ID 2 {E.ListaT rue = makelist(P roxq);E.ListaF alse = makelist(P roxq + 1);Geracod(if ID 1 .nome opRel ID 2 .nome goto );Geracod(goto ); }E → ID{E.ListaT rue = makelist(P roxq);E.ListaF alse = makelist(P roxq + 1);Geracod(if ID.nome goto );Geracod(goto ); }M → ε {M.quad = P roxq; }Neste esquema, E.ListaTrue e E.ListaFalse são atributos sintetizados (listas) que indicamquádruplas com comandos de desvio incompletos. Os endereços são preenchidoscom o valor armazenado em M.quad quando um backpatching ocorre na lista.Exemplo: a < b || c < d && e < fEListaTrue=100,104ListaFalse=103,105ListaTrue=100ListaFalse=101E||MQuad=102EListaTrue=104ListaFalse=103,105A < BListaTrue=102ListaFalse=103E&&MQuad=104EListaTrue=104ListaFalse=105C < DE < FFigura 6.2: Backpatching para expressões lógicas100: if A < B goto 100: if A < B goto101: goto 101: goto 102102: if C < D goto 102: if C < D goto 104103: goto 103: goto104: if E < F goto 104: if E < F goto105: goto 105: goto65

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!