Projeto 1
Na primeira etapa será implementado um parser que converterá um subconjunto de latex para html.
O cabeçalho do arquivo latex que poderá conter:
- Definição de pacotes (\usepackage{nomepacote}): deverá ser ignorado
- Definição de do título (\title{titulo}): ver sobre o comando \maketitle adiante
- Definição do autor(\author{nomeautor}): deverá ser ignorado
O corpo do documento em latex poderá ter textos, texto sob o modo matemático ou comandos.
O modo matemático será demarcado somente pelo sinal cifrão (cuidado que \$ poderá ser utilizado para mostrar o caracter $ ao invés de entrar no modo matemático). O seu conteúdo deve ser renderizado como o modo matemático do Latex (existem bibliotecas javascript que podem ajudar nesta parte).
Os comandos latex que poderão estar incluídos no arquivo serão:
- \maketitle: irá mostrar o título descrito pelo \title no cabeçalho (você pode supor que sempre que um \maketitle estiver presente, existe um \title também).
- negrito: \textbf{texto1} deverá ter como resultado texto em negrito
- itálico : \textit{texto1} deverá ter como resultado texto em itálico
- listas não numeradas: \begin{itemize } \item texto1 \item texto2 \end{ itemize } deverá gerar uma lista com os itens texto1 e texto2 (detalhe as listas podem estar encadeadas)
- imagens: \includegraphics{arquivo} deverá mostrar a imagem arquivo
O projeto será implementado utilizando qualquer ferramenta, porém recomenda-se a utilização da ferramenta ANTLR. Note que a especificação do projeto está consideravalmente livre, então use sua criatividade para implementar o proposto.
Veja alguns casos de teste aqui.
Submissão
A submissão dos arquivos do projeto deverão ser feitos através do Susy . As Senhas foram enviadas por email, se você não recebeu a sua, entre em contato com o monitor da disciplina.
No susy deverá ser submetido um arquivo .tar.gz que deverá conter a seguinte estrutura na sua raiz:
- Um diretório chamado raXXXXXX_raYYYYYY, se você está fazendo o projeto em duplas ou raXXXXXX se está fazendo o projeto individualmente. Dentro deste diretório, devem aparecer os seguintes arquivos:
- Um diretório chamado src, onde você deverá colocar todo o conteúdo de código do seu projeto (arquivo com gramática, código fonte, arquivos de bibliotecas, etc.). Atenção: não colocar binários de qualquer tipo (inclusive .class) do seu projeto.
- Um arquivo Makefile que deverá responder aos seguintes comandos:
- 'make need_install'. Este comando deverá imprimir '1' caso seja necessário instalar algum pacote para compilar ou rodar seu programa. Caso não seja necessário, esse comando não deverá fazer nada
- 'make compile'. Este comando deverá preparar seu projeto para ser rodado (se precisar compilar ou configurar alguma coisa, coloque isso dentro desse comando). Após a execução desse comando, o seu projeto deverá estar pronto para ser executado.
- 'make run INPUT=<arquivo de entrada> OUTPUT=<arquivo de saída>'. Esse comando deverá rodar seu projeto, lendo o arquivo tex de entrada e escrevendo a saída no arquivo html passado.
- Opcionalmente, escreva um arquivo LEIAME.txt. Use esse arquivo para informar qualquer coisa que achar pertinente sobre seu laboratório (fez coisas a mais, a menos, precisa instalar alguma coisa, etc.). Atenção: caso seja necessária a instalação de algum pacote, este arquivo é obrigatório e deve conter informações detalhadas sobre os pacotes que devem ser instalados (links para o projeto, versão instalada, como instalar, etc).
- Opcionalmente, você pode colocar qualquer coisa que achar pertinente dentro de um diretório chamado 'misc'. Neste caso, escreva no arquivo LEIAME.txt o que há dentro desse diretório.
Atenção: O não cumprimento de qualquer requisito de submissão influenciará na nota do grupo!.
Projeto 2
Este segundo projeto abordará o tópico de geração de código.
Teoria
A parte teórica da necessária para a implementação do laboratório foi
vista no curso de MC910, e pode ser revista nos
slides da disciplina ou capítulo 9 do Appel (2a edição).
É importante ressaltar que conhecimentos sobre Árvores de representações
intermediária, também vistos na disciplina MC910 e contidos no
capítulo 7 do Appel (2a edição), são necessários.
Descrição
Você deverá implementar uma classe na linguagem Java que recebe uma
lista de árvores e sobre elas executa um algoritmo de seleção de
instruções (maximal munch, por exemplo) e devolve uma lista com as
instruções referentes a essas árvores. Para mais detalhes sobre os nós
que podem estar nessas árvores, você pode verificar o livro do Appel
(2a edição) na seção 7.1 ou na
documentação das classes .
As instruções deverão ser instruções assembly para a arquitetura x86,
e você deverá utilizar as
classes auxiliares para essas instruções . Note que a
arquitetura é diferente da arquitetura utilizada pelo livro do Appel,
portanto a parte da implementação do livro (seção 9.3) não
necessariamente diz respeito ao que deve ser implementado no projeto
(porém pode ajudar a entender melhor o que fazer).
Uma estrutura inicial do projeto pode ser encontrada aqui.
Submissão
A submissão dos arquivos do projeto deverão ser feitos através do Susy . Deverá ser enviado um arquio .tar.gz e seu conteúdo deve seguir a estrutura passada (obviamente, você deve alterar o seu RA e de sua dupla ou remover o segundo RA). Se você decidiu separar a implementação em várias classes, altere o Makefile para que ele compile e rode corretamente. Novamente, o não cumprimento de qualquer requisito de submissão influenciará na nota do grupo!
Projeto 3
Neste terceiro projeto você deverá implementar a otimização de Constant Propagation para o compilador.
Teoria
Para a implementação dessa otimização, serão necessários os conceitos de
Reaching definitions
slides da disciplina ou capítulo 17 do Appel (2a edição). A descrição de Constant propagation se encontra
no capítulo 17 do Appel (2a edição).
Descrição
Para essa otimização, primeiramente você terá que implementar a análise de fluxo
de dados no compilador de Reaching Definitions. A partir daí, você deverá implementar a otimização
de Constant Propagation usando essa análise. O Constant Propagation deverá alterar o assembly das
instruções afetadas.
Uma estrutura inicial do projeto pode ser encontrada aqui.
Submissão
A submissão dos arquivos do projeto deverão ser feitos através do Susy . Deverá ser enviado um arquio .tar.gz e seu conteúdo deve seguir a estrutura passada (obviamente, você deve alterar o seu RA e de sua dupla ou remover o segundo RA). Se você decidiu separar a implementação em várias classes, altere o Makefile para que ele compile e rode corretamente. Novamente, o não cumprimento de qualquer requisito de submissão influenciará na nota do grupo!
|