Geração de Código Intermediário
Expressões Relacionais
Portugol
...
cont <= 5
...
#7
oprel = token.getlexeme();
gera_cod (“STO”, TEMP_ESQ);
#8
gera_cod (“STO”, TEMP_DIR);
gera_cod (“LD”, TEMP_ESQ);
gera_cod (“SUB”, TEMP_DIR);
M. Pilha
LD
STO
LDI
STO
LD
SUB
BGT
cont
1000
5
1001
1000
1001
rotulo
Expressões
<exp1> ::= <exp1> ‘>’ #7 <exp2> #8
| <exp1> ‘<’ #7 <exp2> #8
| <exp1> ‘>=’ #7 <exp2> #8
| <exp1> ‘<=’ #7 <exp2> #8
| <exp1> ‘!=’ #7 <exp2> #8
| <exp1> ‘==’ #7 <exp2> #8
| <exp2>
<exp2> ::= <exp2> ‘+’ #6 <exp3>
| <exp2> ‘-’ #6 <exp3>
| <exp3>
<exp3> ::= ID #4
| NUM_INT #5
Geração de Código Intermediário
Desvio Condicional Simples
Código Portugol
Lógica Assembly
Código BIP
código para
exp
se (val > maior) entao
maior  val
fimse
se falso salta r1
código para
lista_cmd
r1:
Esquema de Tradução para Geração de Código
<cmd>:== se <exp> entao #9<lista_cmd> <r_senao> fimse #10
<r_senao> ::= senao #11 <lista_cmd>
#9
rot = newRotulo();
push (rot);
if (oprel == “>”)
gera_cod (“BLE”, rot);
if (oprel == “<”)
gera_cod (“BGE”, rot);
...
// idem para BEQ, BNE, BGT, BGE, BLT, BLE
#10
rot2 = pop ();
Gera_cod (“ROT”, rot2);
R1:
LD
STO
LD
STO
LD
SUB
BLE
LD
STO
val
1000
maior
1001
1000
1001
R1
val
maior
Geração de Código Intermediário
Desvio Condicional Composto
Código Portugol
Lógica Assembly
Código BIP
código para
exp
se (val > maior) entao
maior  val
senao
val  0
fimse
se falso salta r1
código para
lista_cmd
JMP r2
r1:
código para
lista_cmd
r2:
Esquema de Tradução para Geração de Código
<cmd>:== se <exp> entao #9<lista_cmd> <r_senao> fimse #10
<r_senao> ::= senao #11 <lista_cmd>
#11
R1:
R2:
rot = newRotulo();
rot2 = pop ();
gera_cod (“JMP”, rot);
push (rot);
gera_cod (“ROT”, rot2);
LD
STO
LD
STO
LD
SUB
BLE
LD
STO
JMP
val
1000
maior
1001
1000
1001
R1
val
maior
R2
LDI
STO
0
val
Geração de Código Intermediário
Laço de Repetição Enquanto
Código Portugol
enquanto (cont <= 5)
cont <- cont + 1
fimenquanto
Lógica Assembly
r1:
Código de M. Pilha
R1:
código para
exp
Se falso salta r2
código para
lista_cmd
JMP r1
r2:
R2:
LD
STO
LDI
STO
LD
SUB
BGT
LD
ADDI
STO
JMP
cont
1000
5
1001
1000
1001
R2
cont
1
cont
R1
Geração de Código Intermediário
Laço de Repetição Enquanto
Esquema de Tradução
<cmd>::= enquanto #12<exp> #13 faca <lista_cmd> fim_enquanto #14
Lógica Assembly
r1:
código para
exp
Se falso salta r2
código para
lista_cmd
JMP r1
r2:
#12
rot = newRotulo();
push (rot);
gcod (“ROT”, rot);
#13
rot2 = newRotulo();
push (rot2);
if (oprel == “>”)
gera_cod (“BLE”, rot2);
if (oprel == “<”)
gera_cod (“BGE”, rot2);
...
// idem para BEQ, BNE, BGT, BGE, BLT, BLE
#14
rot2 = pop();
rot = pop();
gcod (“JMP”, rot);
gcod (“ROT”, rot2);
Geração de Código Intermediário
Laço de Repetição Faça Enquanto
Código Portugol
Faca
cont <- cont + 1
enquanto (cont <= 5)
Lógica Assembly
Código de M. Pilha
R1:
r1:
código para
lista_cmd
código para
exp
se true salta r1
LD
ADDI
STO
LD
STO
LDI
STO
LD
SUB
BLE
cont
1
cont
cont
1000
5
1001
1000
1001
R1
Geração de Código Intermediário
Laço de Repetição Faça Enquanto
Esquema de Tradução
<cmd>::= faca #15 <lista_cmd> enquanto <exp> #16
Lógica Assembly
r1:
código para
lista_cmd
código para
exp
se true salta r1
#15
rot = newRotulo();
push (rot);
gcod (“ROT”, rot);
#16
rot2 = pop();
if (oprel == “>”)
gera_cod (“BGT”, rot2);
if (oprel == “<”)
gera_cod (“BLT”, rot2);
...
// idem para BEQ, BNE, BGT, BGE, BLT, BLE
Geração de Código Intermediário
Laço de Repetição Para
Código Portugol
para (i=1; i<10; i++)
escreva (i)
fimpara
Lógica Assembly
inicialização
r1:
código para
exp
Código de M. Pilha
R1:
se false salta r2
código para
lista_cmd
incr/decr
JMP r1
r2:
R2:
LDI
STO
1
i
LD
STO
LDI
STO
LD
SUB
BGE
LD
STO
LD
ADDI
STO
JMP
i
1000
10
1001
1000
10
R2
i
$out_port
i
1
i
R1
Geração de Código Intermediário
Exercícios
Descreva a Lógica Assembly e esquema de tradução para:
1) Comando de Entrada de Dados (LEIA)
2) Comando de Saída de Dados (ESCREVA)
3) Laço de repetição com variável de controle (PARA)
Download

geração de codigo intermediario – BIP (gals)