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

Desenvolva um programa em Simpletron Machine Language, que apresente o maior número de três números fornecidos pelo usuário. Por exemplo, caso os números fornecidos pelo usuário sejam 5, 7 e 4, o programa deverá apresentar como resposta o valor 7, que é o maior número entre os três números fornecidos pelo usuário.

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

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

Questão 03

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

  1. ABC/-DE*F+/
  2. ABC/DE-/F+*
  3. ABC/DE-F/*+
  4. ABC/D-EF*/+
  5. ABD/CE+/F-*

Questão 04

Analise as seguintes afirmativas sobre o BACK-END (fase de síntese) de um compilador:

  1. Apesar da geração de código intermediário tornar a implementação do compilador mais portável, já que o código intermediário pode ser traduzido para várias arquiteturas diferentes, o código intermediário é geralmente mais difícil de ser otimizado já que ainda é muito longe do código alvo final.
  2. O problema de gerar código ótimo é indecidível. Geralmente nos contentamos com técnicas heurísticas que, na maior parte do tempo geram bom código.
  3. São exemplos de código intermediário as notações pré-fixa e pós-fixa que facilitam a geração de código para uma máquina de pilha e o código de três endereços em que cada instrução faz referência a no máximo três variáveis (endereços).

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.

A = (A + 3) * (B - 5);
B = (A * 2) + (B - 5);
C = (7 + (A * 2));

Questão 06

No programa abaixo, escrito em Pascal, os parâmetros do procedimento vr são passados por valor.

program teste;
var x, y : integer;
  procedure vr(u, v : integer);
  begin
    u := 2 * u;
    x := u + v;
    u := u – 1;
  end;
begin
  x := 4;
  y := 2;
  vr(x, y);
  writeln(x);
end.

O valor de x impresso na última linha do programa é:

  1. 4
  2. 5
  3. 7
  4. 8
  5. 10
Dado o comando de atribuição x = a - (b - a * (c + b / d)), apresente o código objeto gerado, considerando as otimizações disponíveis e a disponibilidade de no máximo quatro registradores.