Segundo Trabalho de LC

 

 

Data de entrega: 26 de Novembro (Sexta feira), por email.

Data da entrevista:  29 de Novembro (turmas de Segunda) e 2 de Dezembro (turmas de Quinta). Entregue uma listagem em papel na data da entrevista, junto com a folha de capa.

Grupos de até duas pessoas. Os membros do grupo poderão ser de turmas diferentes.

 

O trabalho consiste de quatro partes


 

  1. a geração de código em C. Faça a geração de código de Simples para C de acordo com o artigo Geração de Código em C para Simples, exceto em um ponto: a geração de código para envio de mensagens deve ser feita de acordo com o texto Geração de Código de Simples para C - Um Meio Alternativo de Gerar Código para Envios de Mensagem. A geração de código em C deve ser corretamente identada;
  2. adicione à linguagem Simples diretivas para a produção automática de “getters” e “setters”. Se uma variável de instância for declarada como
       var count(g) : integer;
    então o compilador deverá criar um método getCount() : integer que apenas retorna a variável. Se count for declarada como
       var count(s) : integer;

    então o compilador deverá criar um método setCount(count : integer) que inicializa a variável com um parâmetro. Se count for declarada como qualquer das duas formas abaixo, o compilador deve criar o getCount e setCount.
       var count() : integer;
       var count(gs) : integer;
    Faça todas as conferências semânticas associadas a esta nova regra;
  3. adicione à linguagem Simples um meio de direcionar mensagens automaticamente para variáveis de instância. Se uma classe for declarada como
       class B subclassOf A forwardsTo x, y
          private:
             var x : C;
                 y : D;
          public:
             ...
       end

    então B, além de herdar de A, terá todos os métodos de C e D. Para cada método m de C (e D), o compilador deverá inserir um método
       proc m(p1: T1; ... pn : Tn) : R
          begin
          return x.m(p1, ..., pn);
          end

    na
    classe A. Naturalmente, os parâmetros de m e o tipo de retorno devem concordar com os de C. Faça todas as conferências semânticas associadas a esta regra. A regra da gramática para uma classe agora é
         ClassDec ::=
    “class” Id [ “subclassOf” Id ]  [ “forwardsTo”  Id { “,” Id } ]   UnPubPri  “end”
    Claramente a classe B não pode declarar nenhum método que esteja em C ou D. E a intersecção dos métodos de C e D deve ser vazia. Os identificadores que se seguem à palavra “forwadsTo” devem ser variáveis de instância da classe;
  4. o compilador deverá sinalizar um erro quando
        - uma
    variável local é utilizada  mas nunca é inicializada;
        - uma
    variável local é inicializada mas nunca utilizada;
        - uma
    variável local não é inicializada.
    Uma
    variável é utilizada se ela aparece em uma expressão (método factor da classe Compiler). Uma variável é inicializada se ela aparece do lado esquerdo de uma atribuição (em “x = y”, x é inicializado). Naturalmente, apenas um dos erros acima pode acontecer por vez. O compilador deve detectar estes erros se, ao chamar o compilador, utilizarmos a opção –w de compilação. Exemplo:
          java Comp –w  er-chk07.s

 

 

O exercício abaixo valerá dois pontos extras.

 

Faça a movimentação de código constante para fora de laços. Veja a página 113 da apostila antiga de Construção de Compiladores. Se houver uma expressão constante dentro de um laço, coloque-a em uma variável temporária declarada fora do laço. Por exemplo, otimize
  i = 0;
  while i < n – 1 do
      begin
      write(i);
      i = i + 1;
      end
para
  i = 0;
  tmp = n – 1;
  while i < tmp do
      begin
      write(i);
      i = i + 1;
      end

onde tmp foi declarada como inteira. Faça esta otimização apenas no código em C (o genHTML deve continuar a emitir
como saída o programa original). Naturalmente, se tivéssemos uma expressão constante mais complicada como “n – a*2 + 1”, ela também deveria ser colocada em tmp. Se temos algo como “while i + (n-1) < 3*m do” com (n-1) e (3*m) constantes, ambas as expressões devem ser retiradas do laço.

 

Até o dia 26 de Novembro, envie o trabalho zipado por email para jose#dc.ufscar.br (troque # por @) com o subject  “LC04”, sem as aspas. No zip, inclua os .class além dos .java. NÃO inclua nenhum outro arquivo. Ao descomprimir o seu arquivo zip para um diretório X, o arquivo principal, Comp.class, deve estar em X, não em um diretório dentro de X.  Ou seja, não coloque a classe principal dentro de nenhum pacote de Java.

            No dia da entrevista, entregue o trabalho impresso com a folha de capa. Trabalhos sem a folha de capa não serão aceitos. Apenas um membro do grupo deve entregar o trabalho impresso ao professor.

 

Veja a página Material de aula para um manual da linguagem Simples. Para fazer os trabalhos, utilize o Guia de Correção dos Trabalhos e o site How to Write Unmaintainable Code.

 

Este compilador deve ter obrigatoriamente as características descritas abaixo.

  • A geração de código deverá ser feita em métodos nas classes da ASA;
  • A classe principal do compilador deve se chamar “Comp”. A classe principal é aquela com o método main;
  • O compilador deve tomar o nome do arquivo a ser compilado como entrada, isto é; para chamá-lo, poderemos digitar
           C:\>java Comp Hello.s
    “Hello.s” é o nome do programa a ser compilado. Isto é, não coloque a classe Comp dentro de um pacote. Isto é extremamente importante;
  • O compilador deve produzir como saída, além do arquivo em C, um arquivo texto com nome igual ao arquivo de entrada. Este arquivo deve ter extensão “.txt” e deve ser criado no diretório corrente. Assim, ao chamar o seu compilador usando
           java Comp c:\lc\
    testes\ok-sin01.s
    o
    compilador deve produzir arquivos  ok-sin01.c  e ok-sin01.txt no  diretório corrente. O arquivo “ok-sin01.c” é o código C produzido. O arquivo “ok-sin01.txt” contém 0 ou o número da linha de ok-sin01.s que contém um erro, seguido da mensagem de erro. Se não houve erro ao compilar o programa dado como entrada, o primeiro caráter do arquivo de saída (ok-sin01.txt neste exemplo) deve ser ‘0’ (ASCII 48, não ASCII 0). Se houve erro de compilação, o arquivo de saída 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 de saída produzido quando houve e quando não houve erro. É necessário emitir apenas e tão somente um único erro. Se o erro não for no arquivo fonte, como erro de leitura do arquivo de entrada ou arquivo de entrada inexistente, utilize -1 como número de linha (veja Comp.java). Após esta linha, coloque a linha do arquivo de entrada que causou o erro (veja o exemplo). Imprima estas mesmas informações na saída padrão. Note que o compilador fornecido já emite erros como pedido. É necessário apenas que você não modifique o que já está funcionando.
  • Faça todos os testes correspondentes aos possíveis erros léxicos, sintáticos e de geração de código. Isto é, teste o seu compilador com todos os testes ok-*.s. Ele deve passar em todos.  A menos que você altere o compilador dado pelo professor, não se preocupe com os erros léxicos e sintáticos. Mas não se esqueça de compilar todos os ok-ger*.s, compilar o código em C produzido, executar estes programas e verificar se eles produzem o resultado esperado. Sem este teste, não é possível saber se o seu código está realmente funcionando.

 

Observações gerais sobre o trabalho:

  • entregue o trabalho com a capa. Absolutamente não serão aceitos trabalhos sem que as questões desta capa estejam respondidas;
  • 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 15% do código pode ser copiado, mesmo com observações na folha de capa;
  • na impressão do trabalho, utilize a fonte courier;
  • 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.