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.
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.
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).
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.
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.
Os trabalhos práticos correspondem às diferentes fases de um compiladora:
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.
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.
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.
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.
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.
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.
O projeto Eclipse do parser recursivo feito na aula de 04/04/2012 está aqui.
O project Eclipse do parser JACC feito na aula de 09/05/2012 está aqui.
O project Eclipse do analisador semântico feito na aula de 28/05/2012 está aqui.
O project Eclipse do gerador de código feito nas aula de 04 a 11/06/2012 está aqui.
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.
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...
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.