Últimas Notícias

 

 

17 de Novembro

 

            Os grupos que entregaram o trabalho devem marcar a entrevista o MAIS RÁPIDO POSSÍVEL.  Senão as pessoas esquecem o que fizeram no trabalho e todo mundo fica para o final do semestre. E aí não dá tempo.

 

            A partir de hoje as primeiras pessoas a entregar o trabalho poderão vir pegar uma recompensa gastronômica na minha sala. Há um número limitado de guloseimas que irá diminuir em número dia a dia, mesmo que ninguém venha requisitá-las. Elas desaparecem misteriosamente da minha gaveta por algum fenômeno ainda não explicado pela ciência.

 

            Estão disponível todos os .c gerados a partir dos ok-*.s. Eu utilizei o compilador Robson-Wendell para gerar os .c.

 

            Para fazer o item 2 do homework, modifique o genC de MethodDec para algo parecido com

 

class MethodDec {

 

   void genC(PW pw) {

   

      String counter = getClass().getName() + "_"  + getName() + "_count";

      pw.println( counter + " = 0;");

 

      // gera o código do método

     

      ...

      pw.println( counter + "++;" );

      ...     

 

   }

}

 

Ao gerar "void main() {" no método genC de Program,  percorra todas as classes e para cada método de cada classe,

imprima

   printf("ClassName::MethodName called %d times\n", ClassName_MethodName_count );

  

  

  

 

11 de Novembro

 

            Há 127 testes em c.bat e não 128 como disse abaixo. O meu c.bat tem 128 testes, mas o de vocês tem 127.   

 

6 de Novembro

 

            Alguém tem o Borland C++ completo ? O meu aparentemente não tem depuração passo a passo e certamente não tem o help completo.

 

            Os números da capa do segundo trabalho estavam errados. Só isso. Eu os corrigi e deixei a nova capa na página.

 

            Há 128 testes em c.bat e não 127 como é dito em c.bat mesmo. Então, ao chamar o programa Degree, utilize 128:

                   java Degree 128

 

            que eu tinha anteriormente fixado a data de entrega do segundo trabalho para 14 de Novembro, seria ruim descontar nota de quem entregar antes desta data. Então fixei novas notas máximas para o trabalho, que depende do dia de entrega. Veja as tabelas abaixo. Por exemplo, o trabalho valerá no máximo 7.3 para quem entregar o trabalho no dia 27 de Novembro.

 

Novembro

Dom

Seg

Ter

Qua

Qui

Sex

Sáb

 

 

 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17 (10.0)

18 (9.7)

19 (9.4)

20 (9.1)

21 (8.8)

22

23

24 (8.5)

25 (8.1)

26 (7.7)

27 (7.3)

28 (6.9)

29

30

 

 

 

 

 

 

 

Dezembro

Dom

Seg

Ter

Qua

Qui

Sex

Sáb

 

1 (6.5)

2 (6.0)

3 (5.5)

4 (5.0)

5 (4.5)

6

7

8 (0)

9 (0)

10 (0)

11 (0)

12 (0)

13

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

30 de Outubro

 

            As notas do primeiro trabalho sairam. Os alunos com nota igual a -1 devem me procurar. As notas foram bem piores do que eu gostaria. Infelizmente tivemos inúmeros trabalhos incompletos. Muitos e muitos grupos poderiam ter recebido uma nota bem maior se tivessem gastado meia hora a mais no trabalho, o que seria suficiente para fazer os .c gerados compilar, por exemplo. Ou poderiam ter preenchido a folha da capa corretamente. Ou colocado aspas na impressão de strings (veja abaixo).

 

            Parece que as pessoas não levaram a sério o preenchimento da folha de capa. Uns não colocaram a turma a que pertencem (A, B, C ou D, não BCC02, etc). Outros disseram que o trabalho gera código em C correto, quando não gera nem mesmo um único exemplo corretamente. Outros responderam sim à pergunta “o código executado produz o resultado esperado ?quando nenhum dos exemplos funciona. Não considero estas respostas honestas, pois a nota é baseada, parcialmente, nas respostas das perguntas. No próximo trabalho eu serei mais rígido com relação a estas respostas. Mesmo neste primeiro trabalho os grupos que responderam falsamentesim/não” tiveram as notas diminuídas.

 

            Uma grande maioria das pessoas sequer testou o código gerado em C para ver se ele compilava. Muitos geravam código para escrever strings (como em write(“The output ...”)) errado, sem as aspas (write(The output ...)). Então nenhum dos testes compilava, pois todos eles têm uma escrita de string. Corrigi à mão estes erros e considerei o restante do trabalho.

 

            No segundo trabalho, no itemgeração de interfaces”, alguns métodos de ok-chk02 sairão truncados na geração da interface das classes. Por exemplo, ao invés de imprimir

    m_integer_boolean_String_returns_boolean

o seu compilador imprimirá

    m_integer_boolean_String_return

Isto não será um erro seu. Este arquivo de teste (ok-chk02.s) possui métodos com  muito mais caracteres do que os 31 permitidos por Simples. Se alguém quiser, pode eliminar o teste

                if ( ident.length() > MaxChIdent )

                   ident.setLength(MaxChIdent);

na classe Lexer. Assim o teste funcionará direito. Vai aparecer um erro em algum arquivo er-lex*.s, mas não tem importância.

 

            Depois de fazer o refactoring no arquivo ok-chk07.s, não imprima o resultado em um arquivo “ok-chk07.s”, senão você estará escrevendo em cima do arquivo original. Seria MUITO bom se você criasse um arquivo “ok-chk07.r”. Assim todo mundo criará arquivos com mesmo nome.

 

29 de Outubro (22h)

 

            Pessoal,  muitas pessoas usaram a seguinte mensagem de erro:  “Method XXX don’t exist”. Isto está claramente errado !!! Deve ser “Method XXX does not exist”. Ou melhor, “Method XXX was not declared”.

 

29 de Outubro (16h)

 

            O trabalho foi adiado para o dia 7 de Novembro (leia-se dia 10, Segunda). Entre os dias 11 e 17, será descontado 0.1 por cada dia útil de atraso. Entre os dias 18 e 24, será descontado 0.4 por cada dia útil. Entre os dias 25 e 1 de Dezembro, 0.6 por cada dia útil.

 

 

29 de Outubro

 

            O exemplo de refactoring  pode ser modificado de

 

   refactoring.extractClass("Person", "Student",

        new Object[] { "getCourse", "setCourse", "getNumber", "setNumber" },

        new Object[] { "course", "number" } );

 

para

 

   refactoring.extractClass("Person", "Student",

        new String[] { "getCourse", "setCourse", "getNumber", "setNumber" },

        new String[] { "course", "number" } );

 

Neste caso, a interface de extractClass seria

     void extractClass( String, String, String [], String [] )

 

 

27 de Outubro

 

            Algumas pessoas estão em dúvida quanto à última parte do trabalho 2, refactorings. O refactoring “extract class”, se feito à mão, seria mais ou menos assim:

 

***************  início ******************

 

// Queremos criar Student a partir de Person

// extraindo métodos getCourse e setCourse e

// variável de instância course.

 

person = symbolTable.getInGlobal("Person");

ClassDec newClass = new ClassDec("Student");

newClass.setSuperclass(person);

 

Method m = person.searchMethod("getCourse");

newClass.addMethod(m);

 

Method m = person.searchMethod("setCourse");

newClass.addMethod(m);

 

InstanceVariable iv = person.searchIV("course");

newClass.addInstanceVariable(iv);

 

program.addClass(newClass);

 

program.genSimples(pw);

 

***************  fim ******************

 

24 de Outubro (20h)

 

            Os testes ok-ger15.s, er-sem53.s e er-sem54.s estavam errados. Foram corrigidos.

 

24 de Outubro

 

            Mofiquei mais um tópico da capa do trabalho dois. Agora os .class gerados devem estar nos mesmos diretórios dos respectivos .java. Veja o item 7.

 

            Duas pessoas descobriram mais dois erros nos testes (er-chk01.s e ok-chk02.s). Pegue então pela milésima vez o arquivo de testes.

 

            dúvidas sobre como deve ser a sinalização de erros na classe Refactoring. Seria bom criar uma classe RefactoringError com um único método show para sinalizar o erro. Note que fica um pouco estranho usar CompilerError para sinalizar erros em Refactoring pois esta classe utiliza um objeto da classe Lexer, que não faz sentido em nenhum dos refactorings.

 

 

22 de Outubro (19h)

 

            Um anônimo descobriu mais um erro nos arquivos de teste. O erro foi corrigido. O erro era em ok-chk02.s.

 

22 de Outubro

 

            Havia novamente erros nos arquivos de teste. Pegue-os novamente. Sinto muito.

 

            Muitos têm me procurado dizendo que encontram problemas para compilar o compilador, problemas com o classpath. Isto não deve ser um problema, pois a solução é bem simples. Para compilar o seu compilador, faça o seguinte:

        set classpath=.

        javac *.java

Não é necessário colocar quaisquer dos arquivos RComp, CompilerOptions, CompilerError, etc em um pacote. Em particular, RComp NÃO deve ser colocado em um pacote.

 

            A especificação do item 4 de homework foi modificado para torná-la mais clara.

           

            Para não dizerem que eu penso em peixes, vai um site muito interessante: http://seashellworld.com.

 

            Em linhas gerais, o item 2 de warning pode ser feito da seguinte forma:

 

Variable v;

...

  // do lado esquerdo de uma atribuição (assignmentMessageSendStatement)  ou em read

v.setInstanciated();

  // quando aparece em factor()

v.setUsed();

 

// no fim da classe, percorra todas as variáveis de instância

// e verifique se alguma foi usada e não instanciada

   if ( v.getUsed() &&  ! v.getInstanciated() )

      error.show("Variable " + v.getName() + " used but never set", "", 0);

  Se quiser, faça um showWarning que não utilize a linha de erro e o número da linha:

 

   public void showWarning( String strMessage ) {

      out.println("Warning : " + strMessage );

      out.flush();

      if ( out.checkError() )

         System.out.println("Error in signaling an error");

      thereWasAnError = true;

      throw new RuntimeException();

   }

 

Coloque este método em CompilerError.

 

Os tópicos discutidos a seguir não entram no trabalho 2. São apenascuriosidades”.

            Observe que mesmo com este warning uma variável de instância pode ser utilizada sem ter sido inicializada:

   var s : Store;

begin

s = Store.new();

i = s.get(); // oops ...

...

end

 

Para testar se realmente a variável foi inicializada antes de ser utilizada, é necessário um teste em execução. Para isto, devemos utilizar uma variável “was_n_setpara cada variável de instância n. Sempre que n for inicializada, was_n_set recebe true. Inicialmente esta variável é false. Veja abaixo a classe Store original e a transformada (que indica como deveria ser gerado o código)

 

class Store  // original

   private:

      var n : integer;

   public:

      proc get() : integer

         begin

         return self.n;

         end

      proc set(n : integer)

         begin

         self.n = n;

         end

end

 

 

class Store   // classe que indica como deveria ser o codigo gerado, APROXIMADAMENTE

   private:

      var n : integer;

          was_n_set : boolean = false;

   public:

      proc get() : integer

         begin

         if not was_n_set

         then

            /* this code is in C */

            error("IV n of class Store used without being instanciated at line " + 23);

         endif

         return self.n;

         end

      proc set(n : integer)

         begin

         was_n_set = true;

         self.n = n;

         end

end

 

problemas com este modo de criação da classe Store que não serão discutidos aqui.

 

 

21 de Outubro

 

            Alguns testes estavam errados. Havia referências para um inexistente tipo char e alguns testes antigos não passavam nos testes de warning. Baixe novamente testes.zip.

 

16 de Outubro

 

           O texto de refactorings foi mudado. A introdução explica melhor o que é um refactoring.

 

10 de Outubro (18h)

 

            Acabei de modificar a capa do segundo trabalho. Agora vocês deverão enviar apenas os .java e .class do trabalho, entre outras coisas. Veja o item 7 da folha da capa:

 

          7. O seu trabalho deve ser enviado por email para o Professor em formato zip. O arquivo zip, ao ser descomprimido,   

              deve criar os diretórios AST e Lexer diretamente (não deve criar, por exemplo, um standardCompiler e criar AST

              e Lexer dentro deste). Apenas os .java e os .class devem ser enviados. Não envie testes, saídas em C, txt, etc. O

              trabalho deve ser enviado por email com o assunto ou “subject”  LC03. Você obedeceu estas especificações ?

               [   ]  Sim     [   ]  Não

 

10 de Outubro

 

            Ótima notícia: não haverá entrevista do primeiro trabalho. Mas HAVERÁ do segundo ! É por este motivo que coloquei a data da entrega do segundo trabalho várias semanas antes do fim do semestrepara termos mais tempo para as entrevistas, que sempre são um pouco difíceis de agendar.

            para não perder o costume, vejam a página
                      http://fins.actwin.com/species/index.php?t=1&f=2

O Nemo está em  http://fins.actwin.com/species/thumbnails.php?t=8&c=13&f=2.

 

 

8 de Outubro

 

            Na página do segundo trabalho, foi acrescentado um link para o arquivo que contém a classe CompilerOptions, que estava faltando.

 

            Quem ainda não entregou o primeiro trabalho ainda pode entregá-lo ganhando uma parte substancial da nota. descontarei apenas 0.2 pontos por dia útil até Sexta dia 3/10 e 0.3 por cada dia útil após o dia 6/10. Prazo final de entrega: 17 de Outubro.

 

29 de Setembro

 

            Algumas pessoas enviaram o trabalho por email mas não entregaram o trabalho em papel. A listagem do trabalho até poderia (mas é melhor não) ser entregue depois, mas a folha de capa obrigatoriamente deve ser entregue dentro do prazo. A data real de entrega do trabalho é a data de entrega  da

         folha da capa  + listagem

ou

         folha da capa + arquivos do compilador

 

 

26 de Setembro

 

            Pessoal, incrivelmente ninguém descobriu o erro na geração de código para “read(r)” quando “r” é uma variável do tipo String. O artigo “A Linguagem Simples” diz para gerar

       gets(r);

o que está errado. Alguns grupos geraram o código

      { char _s[512];

         gets(_s);

         r = _s;

      }

que também está errado (por quê ?). O correto é

{

   char _s[512];

   gets(_s);

   a = malloc(strlen(_s) + 1);

   strcpy(a, _s);

}

 

Naturalmente, não é necessário corrigir este erro para entregar o trabalho. Mas seria bom corrigi-lo.

 

            A lista lc2003@yahoogroups.com pode ser utilizada para discussão dos trabalhos. As pessoas podem colocar suas dificuldades nesta lista e os outros alunos podem dizer como resolverão o problema proposto. Em todo caso eu respondo também. Desta forma podemos trocar experiências vividas por toda a turma.

 

            Acabei de mudar o prazo de entrega do segundo trabalho. Veja as novas datas:

                                Data de entrega: 31 de Outubro

                                O período de 10-28 de Novembro ficará reservado para as entrevistas dos trabalhos.

 

O primeiro trabalho poderá ser entregue até 1 de Outubro sem desconto da nota.

 

 

25 de Setembro (15:35)

 

            Em ok-ger01.s, a saída que deve ser gerada é

                      7   0   1   2   3   4   5   6

e não

                      7   1   2   3   4   5   6

como está  descrito.

 

25 de Setembro

 

            Muitas pessoas têm me perguntado sobre métodos privados, como gerá-los. Código para eles é gerado exatamente como para métodos públicos. Mas eles não são adicionados na tabela de métodos (TM) da classe. O envio de mensagens a eles, como self.m(), é traduzido para uma chamada estática em C:  A_m(). Isto é tudo.

 

            Pessoal, não é necessário fazer as modificações na geração de nomes para variáveis de instância como indicado no comunidado de 24 de Setembro (está muito próximo do prazo final para modificações). Ou seja, ao invés de gerar o nome em C “A_k” para uma variável de instância chamada “k” da classe A em Simples, pode gerar “k” mesmo. Mas eu gostaria muito que vocês gerassem “A_k”.

 

24 de Setembro

 

            O artigo sobre geração de código de Simples para C contém um erro: ao gerar a declaração de uma variável de instância chamada “n” em Simples, de uma classe “A”, deve-se usar “A_n” em C. O artigo diz para se usar “n” mesmo. Por exemplo, para a classe Simples

 

class A

   private:

      var n : integer;

   ...

end

 

deve-se gerar a declaração em C

 

struct St_A {

   Func *vt;

   int A_n;

   } class_A;

 

Isto permite que uma classe B que herda de A possa ter uma variável de instância com nome n:

 

class B subclassOf A

   private:

      var n : integer;

   ...

end

 

struct St_B {

   Func *vt;

   int A_n;

   int B_n;

} class_B;

 

Note que mesmo assim podemos ter problemas: tente classe A_n com variável de instância n e subclasse A de A_n com variável de instância n_n. Não tentaremos resolver este tipo de problema neste curso.

 

 

23 de Setembro (noite)

 

    Seria bom criar classes MessageSendToSelfPrivate  e MessageSendToSelfPublic. A primeira para representar envios de mensagem para self quando o método é privado. O segundo, quando é público. Estas duas classes podem ter uma superclasse abstrata em comum, MessageSendToSelf. As subclasses poderiam ter apenas o método genC, que é diferente

em ambas.

 

Importantíssimo:  esta disciplina agora tem um grupo no Yahoo. Sempre que eu colocar material novo nesta página eu enviarei uma mensagem ao grupo. Todas as perguntas sobre os trabalhos deverão ser enviadas ao grupo. Assim, todos ficarão sabendo das respostas. Abaixo estão os emails do grupo. O nome dele é “Laboratório de Compiladores – 2003”.

 

 Group Email Addresses

Post message:

lc2003@yahoogroups.com

Subscribe:

lc2003-subscribe@yahoogroups.com

Unsubscribe:

lc2003-unsubscribe@yahoogroups.com

List owner:

lc2003-owner@yahoogroups.com

 

 

 

23 de Setembro

 

            Muitas pessoas estão me pedindo para adiar a data de entrega dos trabalhos. Se todo mundo tivesse começado a fazer o trabalhomuito tempo, não haveria problema algum de adiar a data de entrega. Mas parece que a maioria começou a fazer o trabalho no fim da semana passada. Vamos fazer assim: se uns 20 grupos me entregarem o trabalho até o dia 26, eu adio a entrega dos grupos restantes por mais alguns dias. Se isto acontecer mesmo, é um sinal claro que os grupos estavam trabalhando no projeto a algum tempo. Ok ?

 

22 de Setembro

 

            Dúvidas sobre Orientação a Objetos que estão ocorrendo podem ser sanadas lendo-se o “manualObject Oriented Programming. Este manual não foi corrigido e certamente possui inúmeros erros. Mas mesmo assim deve ser bastante útil para esclarecer pontos obscuros de OOP.

           A página http://www.fishbase.org/photos/BestPhotoThumbnails.cfm possui milhares de fotos belíssimas de peixes. Esta página pertence ao site http://www.fishbase.org. Divirtam-se, pois a vida não se resume a compiladores.

 

4 de Setembro

 

    Vocês precisam da tabela de símbolos para montar a ASA. E vocês farão apenas algumas buscas na TS. Por exemplo, em uma atribuição
        a = 0;
faça uma busca
       Variable v = symbolTable.getInLocal("a");
e crie um objeto de AssignmentStatement:
       Statement s = new AssignmentStatement(v, expr());
Contudo, nãoanálise semântica no código acima, pois não verificamos se a variável "a" estava mesmo na TS. Assuma que nunca haverá erros semânticos - os testes que vocês utilizarão não possuem erros semânticos.

 

3 de Setembro

 

            Na classe Compiler, ignore as linhas

 

      else {

         //# corrija: faça a classe herdar de Any, o equivalente a Object em Java

      }

 

no método classDec. Não criaremos uma classe chamada Any, pelo menos por enquanto.

 

 

26 de Agosto

 

            Os grupos podem ser formados por alunos de diferentes turmas. Mas lembre-se de que o grupo deve ter no máximo dois elementos.

            Para testar se o seu compilador está gerando código em C corretamente, você deverá utilizar os novos testes ok-ger*.s. Eles são (quase) iguais aos testes que estavam antes na página exceto que cada um deles escreve na saída o que o programa deverá imprimir. Mais informações estão em ok-ger01.s. Utilize o arquivo t.bat para compilar todos os ok-ger*.s.

 

            Se quiser relaxar, veja fotos de alguns aquários belíssimos.