enunciado2 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. - Segundo Trabalho Prático de Compiladores -
  2. O segundo trabalho pode ser em grupo de 2 ou individual e tem que ser enviado por email para o docente da turma prática respectiva (Prof. Mário Florido: amf@dcc.fc.up.pt ou Prof. João Barbosa: joao.barbosa@fc.up.pt) com o Subject: TRABALHO COMPILADORES 1, até ao final do dia 15 de Dezembro. A avaliação pressupõe uma apresentação do trabalho que será feita nas aula práticas da semana de 16 a 19 de Dezembro. O trabalho poderá ser implementado em C ou em Haskell.
  3. O objectivo deste segundo trabalho é implementar um compilador do sub-conjunto de RUST considerado para o primeiro trabalho para MIPS.
  4. - Tarefa 1:
  5. Defina ficheiros code.h e code.c para implementar uma estrutura (struct Instr) e respectivos construtores de um código intermédio de três endereços definido por:
  6. instruction -> VAR := atom | VAR := atom binop atom
  7. atom -> VAR
  8. atom -> NUMBER
  9. binop -> PLUS | MINUS | DIV | MULT
  10. 1.b) Defina uma estrutura para listas de instruções, InstrList (lista de apontadores para structs _Instr), respectivos construtores e funções de acesso getFirst e nextInstrs, e uma função append para concatenação de listas de instruções.
  11. 1.c) Defina uma função printInstr para imprimir uma instrução.
  12. 1.d) Defina uma função printListIntrs para imprimir uma lista de instruções.
  13. - Tarefa 2:
  14. Implemente um compilador da árvore abstracta para expressões (struct _Expr) para uma lista de instruções (lista de struct _Instr).
  15. Uma sugestão de protótipo para a função que compila expressões é:
  16. InstrList compileExp(Expr e, char *r); onde r é o registo onde está o valor da availação da expressão na lista de instruções InstrList. Por exemplo:
  17. O resultado da compilação da expressão: x - 2*5 é a lista de instruções:
  18. t1 := x;
  19. t2 := 2;
  20. t3 := 5;
  21. t4 := t1*t2;
  22. t5 := t1 - t4;
  23. e neste caso o registo r é igual a t5.
  24. - Tarefa 3:
  25. Estenda o compilador anterior para lidar com as árvores abstractas correspondentes ao output do primeiro trabalho (lista de comandos do subconjunto do RUST).
  26. Para isso considere o seguinte código intermédio:
  27. instruction -> VAR := atom
  28. instruction -> VAR := atom binop atom
  29. instruction -> GOTO label
  30. instruction -> IF VAR relop atom THEN label ELSE label
  31. instruction -> LAB label
  32. atom -> VAR
  33. atom -> NUMBER
  34. label -> LAB_ID
  35. binop -> PLUS | MINUS | DIV | MULT
  36. relop -> EQUAL | DIF | LESS | GT | LE | GE
  37. 3.1) Implemente outra função de compilação de expressões booleanas com protótipo:
  38. InstrList compileBool(ExprBool e; char *labelTrue, char *labelFalse);
  39. onde labelTrue e labelFalse são as labels para onde a execução do programa em código intermédio deverá ir conforme a compilação da expressão booleana seja respectivamente True ou False.
  40. 3.2) Implemente uma função de compilação de comandos (que chama as função de compilação de expressões aritméticas e booleanas) que terá protótipo:
  41. InstrList compileCmd(Cmd c);
  42. - Tarefa 4:
  43. Estenda as funções printInstr e printListInstr para imprimirem as novas instruções do código intermédio.
  44. - Tarefa 5:
  45. Implemente uma função printMIPS que imprime num ficheiro o código MIPS correspondente à lista de instruções gerada pelo compilador.
  46. (Referência para a tarefa 5: https://www2.cs.arizona.edu/~debray/Teaching/CSc453/DOCS/3addr2spim.pdf)
  47. --------------------------------------------------------------------
  48. Esta mensagem foi enviada a pedido de 238703 - Mário Florido para potencialmente 133 pessoas.
  49. Sistema de Email Dinâmico do SIGARRA - FCUP
  50. --------------------------------------------------------------------