sexta-feira, 26 de fevereiro de 2010

Gerador de Código Intermediário (Código de três Endereços) 1ª parte

A imagem abaixo mostra as fases de um compilador.



















fonte: Compiladores - Princípios Técnicas e Ferramentas. Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman


Há vários tipos de código intermediário: quádruplas, triplas, notação polonesa pós-fixada, etc.
Será descrito uma introdução sobre “Código de três endereços”.

O que isso significa?
O código de três endereços é composto por uma seqüência de instruções envolvendo operações binárias ou unárias e uma atribuição. O nome “três endereços” está associado à especificação, em uma instrução, de no máximo três variáveis: duas para os operadores binários e uma para o resultado.

Mas como assim?
Por exemplo: Instruções de Atribuição
  • Para representar uma instrução de atribuição utiliza o operador de atribuição ":=", onde à esquerda ficará a variável que irá armazenar os valores. Para uma operação binária é mostrado a seguir:
a := b op c
  • Para operador unário:
a := op b
  • Ou, apenas para uma simples cópia:
a := b

Exemplo:
Expressão C/C++ >>> Tradução
  • a= b a := b;
  • a = b + c a := b +c
  • a= -b a := -b
E se for uma operação mais complexa, tipo:
x = y + z * k
Tradução
_t1 := z * k
x := y + t1

Como o nome já diz "três endereços" é o máximo de variáveis por instrução por isso a tradução acima.

Praticando:
1. Traduza os seguinte códigos

a. x := (y + z) * (k - 10)
b. x := k - y / 3
c. x := 2 * 5 - k / 3
d. x := 4 * a * b + h / 2


Faça comentários com as suas respostas do exercício.

====================================