Ybadoo - Soluções em Software Livre
Turmas
2º Semestre de 2015

Desenvolva um programa em Simpletron Machine Language, que apresente o produto dos números fornecidos pelo usuário, até que o usuário forneça o número zero. Por exemplo, caso os valores fornecidos pelo usuário sejam 1, 7, 4, 3 e 0, o programa deverá apresentar como resposta o valor 84, ou seja, 1 * 7 * 4 * 3.

Apresente o grafo de sintaxe da expressão aritmética x = a + a * (b - c) + (b - c) * d, sobre a gramática livre de contexto apresentada a seguir.

G = ({A, E, T, F, V}, {a, b, c, d, x, =, +, -, *, /, (, )}, P, A)
P = {AV=E
     ET+E | T-E | T
     TF*T | F/T | F
     F → (E) | V
     V → a | b | c | d | x}

Questão 03

Qual das seguintes expressões pré-fixas é equivalente à expressão infixa A + (B / C) * ((D - E) / F)

  1. * A + / B C / - D E F
  2. + * / / - A B C D E F
  3. + * A / B C / - D E F
  4. + A * / B C / - D E F
  5. + / * - / A B C D E F

Questão 04

Analise as seguintes afirmativas sobre a etapa de geração de código de um compilador.

  1. A linguagem utilizada para a geração de um código em formato intermediário entre a linguagem de alto nível e a linguagem simbólica deve representar, de forma independente do processador para o qual o programa será gerado, todas as expressões do programa original.
  2. O atrativo da notação pós-fixa, também conhecida como notação polonesa, é que ela dispensa o uso de parênteses ao adotar a noção de pilha para a representação das expressões.
  3. O objetivo da estratégia de eliminação de código redundante é detectar situações nas quais a tradução de duas expressões gera instruções que, combinadas, têm uma execução repetida sem efeito.

A análise permite concluir que:

  1. apenas a afirmativa I está correta.
  2. apenas a afirmativa II está correta.
  3. apenas as afirmativas I, II e III estão corretas.
  4. apenas as afirmativas I e II estão corretas.
  5. apenas as afirmativas II e III estão corretas.

Apresente o código de três endereços, otimizado pela aplicação do método de construção de um grafo acíclico dirigido para blocos básicos, da seguinte sequência de comandos:

X = X + 2 * Y;
Y = 2 * Y + X;
Z = Y + X + 5;

Questão 06

No programa abaixo, escrito em C, os parâmetros da função sub são passados por referência.

void sub(int a, int b, int c)
{
  a = b + c;
  b = a * c;
  c = a + b;
}

void main( )
{
  int x = 1, y = 2, z = 3;

  sub(x, y, x);

  printf("%d %d %d", x, y, z);
}

O texto impresso na última linha do programa é:

  1. 1 2 3
  2. 12 9 3
  3. 3 9 12
  4. 9 9 3
  5. 3 3 6
Dado o comando de atribuição z = ((x + y) - ((x + y) / (x - y))) + ((x + y) / (x - y)), apresente o código objeto gerado, considerando as otimizações disponíveis e a disponibilidade de no máximo três registradores.