O Desafio
O desafio na criação desse projeto começa em compreender como funciona um compilador, ele é normalmente separado em três partes: léxica, sintática e semântica. E cada uma dessas partes tem responsabilidades ligadas entre si, sem alguma dessas partes o compilador não funciona. Também tivemos no projeto a parte de transpilação que nada mais é que, em poucas palavras, traduzir um código de uma linguagem para outra, o mais comum para um compilador seria traduzir a linguagem compilada para a linguagem da máquina, ou seja, os binários.
Além disso, antes de pôr em prática estudo de como funciona cada parte do compilador e da transpilação, também foi necessário o estudo da cada uma das linguagens, tanto o Cool para a parte de compilação, assim como o Bril para a parte de transpilação, pois sem entender como funciona a linguagem não é possível definir características importantes do código para o funcionamento do mesmo, como, por exemplo, palavras reservadas e como funciona a sua semântica.
Estruturando o Código
Para a estruturação do código nas partes léxica e sintática, foi utilizada as bibliotecas lex e yacc respectivamente, o que torna a estruturação do código nessas partes algo simples, somente necessário a definição das palavras reservadas e seus tokens na parte léxica, e na parte sintática, é necessário definir a regex da linguagem, definindo quais caminhos se pode seguir.
Já para a parte semântica e a parte de transpilação, foi algo bem mais complexo e braçal. Na parte semântica foi utilizada uma função recursiva que utiliza de outras funções auxiliares para poder fazer a checagem da linguagem. E na parte de transpilação foi utilizado funções que reescreviam o código para outra linguagem em um arquivo de texto.