MAB 471 – Compiladores I

MAB 471 - Compiladores I

Fabio Mascarenhas

08/07 - As notas finais estão aqui.

Apresentação

Está é a página da disciplina Compiladores I, MAB 471, do professor Fabio Mascarenhas, para o semestre de 2012.1. As aulas da disciplina são às segundas e quartas, das 15 às 17 horas, no LAB I do DCC.

Avaliação

A avaliação será feita por provas e por pequenos trabalhos práticos. A nota das provas corresponderá a 80% da nota final (8 pontos) e a dos trabalhos a 20% (2 pontos). Serão três provas, uma na metade do período e as outras duas no final, e será feita uma média aritmética das duas maiores notas. Não haverá prova final ou segunda chamada. Ainda não estabeleci a quantidade nem a natureza dos trabalhos práticos, mas provavelmente serão versões bastante reduzidas dos trabalhos práticos feitos em 2011.2. A média final é 5,0.

Datas das Provas

P1: 25/04/2012

P2: 25/06/2012

P3: 04/07/2012

Todas as provas caem na quarta-feira, e serão feitas no mesmo horário e local das aulas (LAB 2, 15-17).

Lista de Discussão

A lista de discussão para esta disciplina está no o Piazzza. Acessem esse link e sigam as instruções do site para se inscrever (usem seu email da UFRJ).

Também temos um grupo no Facebook. Acessem aqui.

Livros

O livro texto da disciplina é o "Compiladores: princípios e práticas", de Kenneth C. Louden. Ele está disponível na biblioteca do CCMN.

"Crafting a Compiler with C" de Charles Fischer também tem uma boa cobertura dos aspectos práticos da construção de um compilador, e está disponível na biblioteca do CT e do NCE.

Um excelente livro para quem quiser se aprofundar mais sobre o tema é a segunda edição do "Engineering a Compiler", de Keith D. Cooper e Linda Torczon. Infelizmente ele não está disponível em nenhuma das bibliotecas da UFRJ.

Existe farto material online sobre construção de compiladores, incluindo livros completos. Um bem sintético e com ênfase em construção manual de scanners e parsers recursivos é o livro "Compiler Construction" de Niklaus Wirth, disponível em PDF aqui. Outro livro, mais detalhista, é o "Basics of Compiler Design" de Torben Mogensen, disponível nessa página.

Slides

Listas de Exercícios

Provas

Trabalhos Práticos

Os trabalhos práticos correspondem às diferentes fases de um compiladora:

  1. Analisador léxico da linguagem Gossip, usando JFlex
  2. Analisador sintático da linguagem Gossip, usando JACC
  3. Analisador semântico e gerador de código x86 para TINY Tipado

Os trabalhos serão feitos em dupla. As mesmas duplas valerão para todos os três trabalhos, exceto em casos de trancamento ou abandono, que serão resolvidos caso a caso.

Analisador Léxico

Cada dupla deverá completar a especificação de um analisador léxico para a linguagem Gossip. Ela gerará uma classe gossip.Scanner, com os tokens retornados pelo método getToken() sendo instâncias de gossip.Token. Baixe o esqueleto do projeto Eclipse para o trabalho aqui. O projeto também inclui uma classe gossip.Driver para teste do analisador léxico, e um arquivo exemplo.gossip que exercita todos os tokens do scanner (ele não é um programa sintaticamente válido!). As partes que faltam no analisador estão marcadas com comentários TODO.

A entrega do trabalho deverá ser feita até o dia 25/04/2012, uma quarta-feira, em formato zip, usando esse formulário.

Se tiver qualquer dúvida sobre a especificação da linguagem ou o funcionamento do analisador léxico procure o professor antes de inventar.

Analisador Sintático

Cada dupla deverá completar a especificação de um analisador léxico para a linguagem Gossip. Ela gerará uma classe gossip.Parser, com um método parse() que executa a análise. Caso o programa não tenha erros sináticos o campo output terá uma árvore sintática abstrata (AST) para o programa. O método toString() da raiz da árvore sintática dá uma string equivalente ao programa original (a menos de comentários e espaçamento).

Baixe o esqueleto do projeto Eclipse para o trabalho aqui, e faça as tarefas marcadas com comentários TODO no arquivo gossip/gossip.jacc. O projeto também inclui uma classe gossip.Driver para teste do analisador analisador sintático, programas válidos na pasta corretos, e programas com erros sintáticos na pasta errados.

A entrega do trabalho deverá ser feita até o dia 30/05/2012, uma quarta-feira, em formato zip, usando esse formulário.

Se tiver qualquer dúvida sobre a especificação da linguagem ou o funcionamento do analisador sintático procure o professor antes de inventar.

Análise Semântica e Geração de Código

Cada dupla deverá completar a implementação do analisador semântico e geração de código x86 (assumindo 32 bits e usando o NASM como assembler) para TINY tipado estendido com funções e blocos. Baixe o esqueleto do projeto Eclipse para o trabalho aqui, e faça as tarefas marcadas com comentários TODO no arquivo tiny/AST.java.

As tarefas são basicamente implementar a análise semântica e geração de código para funções e blocos (que têm a mesma semântica de blocos em C). O projeto inclui um driver para testes, que lê um arquivo com extensão .tiny, o executa se ele estiver corretamente formatado e tipado, e escreve um arquivo com extensão .asm com a tradução dele para x86.

A entrega do trabalho deverá ser feita até o dia 27/06/2012, uma quarta-feira, em formato zip, usando esse formulário.

Se tiver qualquer dúvida sobre a especificação da linguagem ou o funcionamento do compilador procure o professor antes de inventar.

Material Adicional

Compilador de expressões aritméticas

Os fontes para o compilador de expressões aritméticas mostrados na aula de 05/03/2012 estão aqui. Calc.java é o compilador, que lê expressões da entrada padrão (separadas com um ponto e vírgula) e escreve o código assembler para LVM na saída padrão. Os scripts calc e calc.bat (para Windows) executam o compilador, gravando a saída dele em um arquivo calc.asm e depois montando e executando a saída.

Especificação léxica de TINY

Palavras reservadas: if, then, else, end, repeat, until, read, write.

Operadores: +, -, *, /, =, <, (, ), ;, :=.

Numerais: um ou mais dígitos.

Identificadores: letras seguidas de letras, dígitos ou _.

Comentários: cercados por chaves ({...}), não podem ser aninhados.

Baixe o analisador léxico.

Baixe o analisador léxico usando o JFlex.

Parser Recursivo para TINY

O projeto Eclipse do parser recursivo feito na aula de 04/04/2012 está aqui.

Parser JACC para TINY

O project Eclipse do parser JACC feito na aula de 09/05/2012 está aqui.

Análise semântica para TINY com tipos

O project Eclipse do analisador semântico feito na aula de 28/05/2012 está aqui.

Gerador de código para TINY Tipado (NASM/x86)

O project Eclipse do gerador de código feito nas aula de 04 a 11/06/2012 está aqui.

Lexical Scanning in Go

Vídeo do Rob Pike mostrando como construir um analisador léxico manualmente, usando a linguagem Go, e como isso é preferível em relação a usar um gerador de analisadores léxicos.

Embedded in Academia: 57 Small Programs that Crash Compilers

It’s not clear how many people enjoy looking at programs that make compilers crash — but this post is for them (and me). Our paper on producing reduced test cases for compiler bugs contained a large table of results for crash bugs. Below are all of C-Reduce’s reduced programs for those bugs. Ler esse artigo...

Contato

Podem entrar em contato pelo meu email que responderei assim que possível. Também tenho um horário de atendimento de alunos na minha sala, segundas e quartas de 17 às 18 horas. A sala é a E-2013 do DCC.


Last modified: Fri Jul 6 11:25:57 BRT 2012