Últimas Notícias
17 de
Novembro
Os grupos que já 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
Já 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 já 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 falsamente “sim/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 item “geraçã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.
Há 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 já 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 só penso em peixes, aí 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 apenas “curiosidades”.
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_set” para 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
Há 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 aí 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 semestre – para termos mais tempo para as entrevistas, que sempre são um pouco difíceis de agendar.
Só 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 trabalho há muito 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 já 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 “manual” Object
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 só
precisam da tabela de símbolos
para montar a ASA.
E aí 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ão há aná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.