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.

Exemplo: A < B || C < D && E < FL1L2if A < B goto RTgoto L1if C < D goto L2goto RFif E < F goto RTgoto RFSupondo que os atributos true e false tenham recebido os rótulos RT e RF.Esquema de Tradução para Comandos de Controle de FluxoS → prSe Expr prEntao S 1S → prSe Expr prEntao S 1prSenao S 2S → prEnquanto Expr S 1{Expr.true = GeraRotulo; Expr.false = S.prox;S 1 .prox = S.prox; S.cod = Expr.cod || S 1 .cod; }{Expr.true = GeraRotulo; Expr.false = GeraRotulo;S 1 .prox = S.prox; S 2 .prox = S.prox;S.cod = Expr.cod || S 1 .cod; ||Geracod(goto S.prox); || S 2 .cod; }{S.inicio = GeraRotulo; Expr.true = GeraRotulo;Expr.false = S.prox; S 1 .prox = S.inicio;S.cod = Expr.cod || S 1 .cod; ||Geracod(goto S.inicio); }6.2 BackPatching (Retrocorreção)O principal problema, na geração de código, é que o código gerado deve incluir comandosde desvio para endereços que, em geral, ainda não são conhecidos. Isso inviabiliza ageração de código num único passo.A solução é utilizar geração de códigos incompletos para os comandos (sem os endereços)que serão devidamente completados quando o endereço destino for conhecido.Chama-se de backpatching ao preenchimento desses endereços não resolvidos.São necessárias três funções para isso:makelist(i) cria uma lista contendo i (um único elemento) e retorna um ponteiro paraa lista criada; o elemento i é um índice do vetor de quádruplas;merge(p1,p2) concatena as listas apontadas por p1 e p2, e retorna um ponteiro paralista resultante;backpatching(p,i) insere i (rótulo destino) no campo de endereço de cada uma dasquádruplas da lista apontada por p.64

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

Saved successfully!

Ooh no, something went wrong!