Laboratório de Compiladores
2008/1
O trabalho
consiste em construir,
em Java, um
compilador para a
linguagem Easy. O compilador deverá fazer a análise léxica, sintática,
semântica e geração
de código em
C para programas
em Easy e emitir
alguns avisos. Haverá várias avaliações
na disciplina, mas apenas duas delas contarão para a média final, que serão a
entrega do compilador completo e o questionário escrito.
Contudo, o trabalho é dividido em várias partes para
facilitar a sua construção. Abaixo colocamos uma tabela com o objetivo de cada
parte e a data da entrega. Ao final de cada uma destas datas, vocês deverão me
enviar o compilador e será atribuído uma nota a ele. Esta nota não conta para a
média final exceto a última, que é do compilador inteiro.
Tarefa
|
Data de entrega
|
Análise léxica (AL)
|
10 março (AL)
|
Análise sintática (AS)
|
20 março (AS+AL)
|
Análise semântica, com os avisos (ASE)
|
30 abril (ASE + AS +AL)
|
Geração de código em C
(GC)
|
13 de junho (GC + ASE + AS + AL)
|
Sendo MT e QE as notas obtidas no trabalho (GC + ASE + AS +
AL) e questionário escrito, a média final MF será calculada como
if MT >= 6 e QE >= 6
then
MF = (QE +
MT)/2
else if QE >= 8
then
MF = (3*MT +
QE)/4
else
MF = menor nota
entre MT e QE
Resumindo: darei notas para os trabalhos entregues em 10 e
20 de março e 30 de abril, mas estas não contarão para a média final. No dia 13
de junho vocês deverão entregar o compilador com tudo feito e no dia 27 de
junho, sexta, faremos o questionário escrito.
A avaliação complementar
consiste de um trabalho T3 e de um questionário escrito E3. A média final com a
avaliação complementar, MFA, será (2*MF + N3)/3, onde MF é a média final da
disciplina no período regular e N3 é calculada como
if ( T3 >= 6 e E3 >= 6 )
N3 = (T3 + E3)/2
else
N3 = menor nota entre T3 e E3
Antes de continuar, você pode pegar todo o
material da disciplina aqui. Coloque o seu trabalho em um diretório “trab” que
deve ser irmão de t, tests e autoT (descomprima o zip). Para testar o seu
trabalho, abra uma janela do DOS, vá para o diretório trab e digite
..\t\test-t1
será criado um arquivo r.txt com um relatório de erros
léxicos, sintáticos e semânticos. Digite agora
..\t\test-t2
será criado um arquivo z.txt que, se analisado, revelará
erros de geração de código.
Entre no grupo desta disciplina: http://groups.google.com/group/lc08?hl=enc
Todas as dúvidas serão tiradas por email, preferencialmente
enviados para a lista da disciplina. Entre no grupo acima para saber o endereço
desta lista.
O questionário escrito é individual.
O trabalho poderá ser feito em grupos de até
duas pessoas.
Certamente algumas modificações serão feitas, durante o
semestre, nos testes e mesmo na especificação da linguagem Easy, já que é a
primeira vez que esta linguagem e os testes são
utilizados por um número grande de pessoas. À medida que as dúvidas e as
falhas forem surgindo, iremos corrigindo os testes e o texto. Como esta linguagem é realmente
fácil, não devemos ter muitos problemas.
O
compilador deve ter as características
descritas abaixo.
- O compilador
deve construir uma ASA
de forma semelhante
à ensinada na disciplina Construção de Compiladores.
Devem existir métodos
genC na maioria das classes da ASA
para a geração
de código.
- A classe
principal do compilador
deve se chamar “Comp” que deve estar em um
package também chamado Comp. A classe principal é aquela com
o método main.
- O compilador
deve produzir como
saída um
arquivo texto
chamado “result.txt”. Se não houve erro ao compilar o programa dado
como entrada,
o primeiro caráter
de “result.txt” deve ser ‘0’ (ASCII 48). Se
houve erro de compilação,
“result.txt” deve conter o número
da linha com
erro seguido por
espaço em
branco, “:”, espaço
em branco
e a descrição do erro,
tudo isso em uma única linha. Veja um
exemplo de arquivo
“result.txt” produzido quando houve e quando
não houve erro. É necessário emitir
apenas e tão somente um único erro. As mensagens de aviso (veja abaixo)
também devem ser colocadas no arquivo “result.txt” com a mesma sintaxe de
um erro.
- O compilador
deve tomar o nome
do arquivo a ser
compilado como entrada,
isto é; para
chamá-lo, poderemos digitar
C:\>java –cp . Comp.Comp Hello.e
“Hello.e” é o nome do programa a ser
compilado. Se houver erros, estes deverão ser
dirigidos à saída padrão. Note que assumimos que a classe principal
do compilador, Comp, está no
diretório C:\Comp.
- O nome
do arquivo de saída
é o nome do arquivo
de entrada com
extensão “.c”. Assim,
no exemplo acima,
o compilador produziria um
arquivo “Hello.c” como saída.
- Os nomes de todos os
integrantes do grupo devem aparecer em um comentário no início de cada
arquivo .java do compilador.
- O trabalho deve
ser enviado
por email para
o Professor em
formato ZIP (e somente ZIP: não use RAR).
O nome do arquivo zip deve ser composto pelos nomes dos dois integrantes
do grupo (ex: AlbertoSantosDumont-NikolaTesla) e, ao descomprimi-lo ele
deve criar um diretório com nome igual ao do arquivo zip e, dentro deste,
deve criar diretórios AST, Comp e Lexer (ou pelo menos Comp), os arquivos
.java e .class devem estar dentro dos respectivos diretórios (Comp.java e
Comp.class dentro de Comp, por exemplo), os arquivo r.txt e z.txt devem
estar no diretório AlbertoSantosDumont-NikolaTesla e o arquivo zip não
deve possuir nenhum outro arquivo que não seja *.java, *.class, r.txt e z.txt.
O trabalho deve ser enviado por
email com o assunto
ou “subject” lc08. É absolutamente fundamental que
o grupo obedeça a estas especificações.
- O compilador
deverá emitir mensagens
de aviso quando:
1. uma constante/variável de um
módulo não
for exportada e nunca for utilizada
no módulo que
a declara;
2. uma variável local nunca
for utilizada;
3. uma variável local nunca
for inicializada;
4. uma variável local for inicializada mas
nunca utilizada em uma expressão
(o que inclui qualquer
uso na regra
“Factor” da gramática). Naturalmente,
emita apenas um
dentre os três
avisos 2, 3 e 4;
5. um parâmetro
for inicializado. Parâmetros nunca deveriam receber
valores em
atribuição;
6. um parâmetro
nunca for utilizado;
7. um procedimento tiver mais do que
oito parâmetros;
8. uma subrotina não for exportada
e nunca puder ser
chamada de dentro
do módulo que
a declara. Veja o exemplo. Coloque todas as
rotinas exportadas de um módulo em uma fila e faça uma busca em largura
utilizando esta fila. Cada rotina é um vértice de um grafo e há uma aresta entre rotinas f e g se
houver uma chamada a g dentro de f;
Pare a compilação por causa de
uma mensagem de aviso. Lembre-se de que as mensagens de aviso também devem
ser colocadas em “result.txt” seguindo as instruções das mensagens de
erro.
Mais
material sobre compiladores/OOP:
1. Object-Oriented
Programming;
2. Extreme Programming (PDF obtido
pelo agrupamento de páginas do site Extreme Programming);
3. artigo
sobre o compilador da linguagem Green;
4. Guia de
Correção de Trabalhos;
5. How to Write Unmaintainable Code
Observações gerais sobre o trabalho:
- o grupo
deve entregar o trabalho impresso com a capa, além de enviar
o zip por email. Absolutamente não serão
aceitos trabalhos sem que as
questões desta capa
estejam respondidas;
- na impressão do trabalho,
utilize a fonte courier;
- você
pode pegar qualquer quantidade do código de qualquer compilador fornecido
pelo professor. Isto inclui os exemplos de compiladores utilizados em
Construção de Compiladores e o compilador de Krakatoa fornecido no início
da disciplina Lab. de Compiladores do semestre passado. Nenhum outro código
poderá ser utilizado, exceto o descrito a seguir. Qualquer parte do trabalho
poderá ser copiada de qualquer
grupo, desde
que este
fato seja escrito
na folha de capa
do trabalho. Trabalhos
com um
número significativo de trechos iguais
sem a devida
observação na capa
receberão zero. A nota do trabalho
diminui com a quantidade
de trechos copiados. De qualquer
forma, não mais do que 10% do código pode ser copiado, mesmo com
observações na folha de capa;
- os grupos podem ser de até dois elementos;
- faça o seu trabalho
utilizando corretamente os princípios de orientação
a objetos. Procure o professor
em
dúvida. Não
serão aceitos mais
alguns erros
cometidos no primeiro semestre
do ano passado;
- não serão
aceitos trabalhos atrasados porque
a data do questionário dificilmente poderá ser modificada, e esta depende
daquela. Portanto, a data de entrega
dos trabalhos não
é prorrogável.
Jamais, em nenhuma hipótese, empreste cópia do código fonte
do seu compilador e muito menos coloque o seu compilador em alguma lista de
emails.
“Amigos pedem a você o
seu tempo (para explicar como se faz), não o seu código.”