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.”