Horário de dúvidas
Para além dos horários das aulas práticas, para quem não está no DCC durante o dia: Quintas-feiras das 18:30 às 19:30 (Gabinete 1.27)
Trabalho 3
-
Prazos e entregaO trabalho deve ser enviado usando o seguinte formulário de entrega antes das 23:00 do dia 07 de Julho de 2012. O trabalho deve ser enviado no formato TAR com todos os ficheiros necessários ao seu funcionamento. Não serão considerados trabalhos apresentados depois de finalizado este prazo.
-
Descrição do trabalhoEscrever um compilador da linguagem "Dumb" (definida para o primeiro trabalho. O output deverá ser código Apoo.
Para a nota mínima, o compilador pode não aceitar funções, arrays e listas, mas tem que aceitar os programas na sintaxe que foi dada como exemplo para o trabalho 1.
É valorizado:
- tratamento de funções (e com elas as frames de activação)
- tratamento de arrays
- tratamento de listas
- optimização de recursão final (tail recursion optimization)
- optimização local
- optimização local de registos
- optimização global de registos
- optimização de variáveis de iteração
- optimização de expressões
- optimizações ligadas com a análise de fluxo e vida de variáveis. -
ClassificaçãoO peso da classificação deste trabalho na nota final da unidade curricular é de 9/20. O trabalho tem que obter uma classificação mínima de 1/3 para que o aluno tenha aproveitamento. Ou seja os trabalhos que não atingirem esta marca excluem liminarmente os alunos respectivos da avaliação dos restantes trabalhos.
O grau de tolerância para com casos de plágio será nulo. Quer isto dizer que trabalhos que resultem de plágio de outros trabalhos que possam ser encontrados na rede, assim como trabalhos que partilhem código com os de outros colegas, serão automaticamente desclassificados, com as consequências inerentes do disposto no parágrafo anterior.
Trabalho 2
-
Prazos e entregaO trabalho deve ser enviado por correio electrónico por forma a que esteja na minha caixa de correio antes das 23:00 do dia 20 de Maio de 2012. O trabalho deve ser enviado no formato TAR com todos os ficheiros necessários ao seu funcionamento. Não serão considerados trabalhos apresentados depois de finalizado este prazo.
-
Descrição do trabalhoEscrever um gerador de código de três endereços, modificando o programa que foi entregue no trabalho anterior, que aceite programas com as seguintes restrições:
- não há declarações nem uso de funções
- só há lugar a variáveis inteiras
O resultado do programa deve ser enviado para o stdout. A cada linha deste código supomos associado o seu numero de ordem que vai ser usado como referência para as labels (Lb) da gramática abaixo. O código de três endereços a ser usado deve ter o seguinte formato:
P -> L "(return)" P | L
L -> A = A O2 A
L -> A = O1 A
L -> A = A
L -> goto Lb
L -> if B goto Lb
L -> ifFalse B goto Lb
L -> if A R A goto Lb
L -> A = Ad[int]
L -> Ad[int] = A
L -> A = &Ad
L -> A = *A
L -> *A = A
A -> Ad | Temp(int)
Ad -> Heap(int)
O2 -> plus | div | mult | mod
O1 -> minus
R -> GT | GTE | LT | LTE | EQ | NOTEQ
B -> true | false
Lb -> int
Nota: foi acrescentado um operador binário "%" para a operação módulo de inteiros:7 % 5 terá o valor 2. O analisador sintáctico/léxico devera ser modificado para suportar esta operação.
O trabalho terá um bónus adicional para cada uma das seguintes caraterísticas- exista uma optimização dos goto gerados para as instruções condicionais
- seja usada a técnica de "backpatching"
-
ClassificaçãoO peso da classificação deste trabalho na nota final da unidade curricular é de 6/20. O trabalho tem que obter uma classificação mínima de 1/3 para que o aluno tenha aproveitamento. Ou seja os trabalhos que não atingirem esta marca excluem liminarmente os alunos respectivos da avaliação dos restantes trabalhos.
O grau de tolerância para com casos de plágio será nulo. Quer isto dizer que trabalhos que resultem de plágio de outros trabalhos que possam ser encontrados na rede, assim como trabalhos que partilhem código com os de outros colegas, serão automaticamente desclassificados, com as consequências inerentes do disposto no parágrafo anterior.
Trabalho 1
-
Prazos e entregaO trabalho deve ser enviado por correio electrónico por forma a que esteja na minha caixa de correio antes das 0:00 do dia 2 de Abril de 2012. O trabalho deve ser enviado no formato TAR com todos os ficheiros necessários ao seu funcionamento. Não serão considerados trabalhos apresentados depois de finalizado este prazo.
-
Descrição do trabalhoConsidere-se a linguagem seguinte (propositadamente aqui descrita de forma pouco formal).
As variáveis têm nomes formados por letras e algarismos (maiúsculas e minúsculas) sendo que o primeiro caracter tem obrigatoriamente que ser uma letra.
Todas as variáveis são obrigatoriamente declaradas andes de qualquer utilização pelas declarações:
int varname
bool varname
list varname
vector varname size
Os vectores (que são unidimensionais) têm os seus valores individuais acedidos por vec[i] sendo vec o nome da variável e i o índice que se pretende aceder.
As listas podem ser construídas explicitamente, sendo que [] representa a lista vazia. Por exemplo:
l <- [1,2,3,4,5,6]
As operações sobre listas são ++ (concatenação de listas), head(l) e tail(l).
Os valores boleanos são True e False
Os operadores sobre inteiros são: + - * /
A atribuição faz-se pelo operador <- . Por exemplo
a <- b + 3
As operações booleanas são o ~ (negação), && (conjunção) e || (disjunção).
As comparações são dadas por < > != = >= <=.
As instruções são escritas uma por linha e os blocos de instruções são delimitados por parêntesis.
A instrução condicional é da forma
if bool then cmd
ou
if bool then cmd1 else cmd2
em que cmd, cmd1 e cmd2 são instruções ou blocos de instruções delimitados por parêntesis, e bool é uma condição.
Os ciclos são da forma
while bool cmd
As definições de funções são da forma:
tfun def fname (arg1 targ1, arg2 targ2)
cmd
o bloco de comandos cmd deve conter pelo menos uma instrução
return val
em que val tem o tipo tfun.
que define uma função de nome fname, neste caso com dois argumentos, arg1 e arg2 de tipos targ1 e targ2, respectivamente.
As instruções de input e output são:
a <- readint
writeint b
que, respectivamente, lê um inteiro e guarda o seu valor em a e escreve o valor de b (outra variável inteira).
Um exemplo de um programa válido:
int def fact (x int)
( if x = 1 then return 1 else return x*fact(x-1))
int a
a <- readint
writeint fact(a)
O primeiro trabalho consiste na escrita de um analisador léxico e sintáctico para esta linguagem, por forma que posteriormente possa ser usado na construção de um compilador. Para este trabalho, deve somente aceita ou recusar um programa. O trabalho deve ser obrigatória mente escrito em OCaml, usando o Menhir ou o ocamllex e o ocamlyacc.
Para ajudar aqui encontram-se alguns programas que devem ser aceites pelo analisador. -
ClassificaçãoO peso da classificação deste trabalho na nota final da unidade curricular é de 5/20. O trabalho tem que obter uma classificação mínima de 1/3 para que o aluno tenha aproveitamento. Ou seja os trabalhos que não atingirem esta marca excluem liminarmente os alunos respectivos da avaliação dos restantes trabalhos.
O grau de tolerância para com casos de plágio será nulo. Quer isto dizer que trabalhos que resultem de plágio de outros trabalhos que possam ser encontrados na rede, assim como trabalhos que partilhem código com os de outros colegas, serão automaticamente desclassificados, com as consequências inerentes do disposto no parágrafo anterior.