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)