Rogério Reis


Err and err and err again, but less and less and less.


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 entrega
    O 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 trabalho
    Escrever 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ção
    O 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 entrega
    O 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 trabalho
    Escrever 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
    1. exista uma optimização dos goto gerados para as instruções condicionais
    2. seja usada a técnica de "backpatching"
  • Classificação
    O 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 entrega
    O 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 trabalho
    Considere-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ção
    O 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.