Compiladores: PASCALjr - WWW2 - Udesc
Compiladores: PASCALjr - WWW2 - Udesc
Compiladores: PASCALjr - WWW2 - Udesc
- 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