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

(Deitel, 2003) A linguagem de programação SIMPLE é uma linguagem simples, mas ainda poderosa e de alto nível, semelhante às versões iniciais da conhecida linguagem de programação BASIC. Cada instrução da linguagem de programação SIMPLE consiste em um número de linha e um comando da linguagem. Os números de linha devem aparecer em ordem crescente. Cada comando inicia com uma das seguintes palavras reservadas da linguagem de programação SIMPLE: rem, input, let, print, goto, if/goto ou end. Desenvolva um programa na linguagem de programação SIMPLE, que apresente os termos da série de Fibonacci. A série de Fibonacci é formada pela sequência 1, 1, 2, 3, 5, 8, 13, 21, 34, .... A série de Fibonacci é de grande importância matemática, e a lei básica é que a partir do terceiro termo, todos os termos são a soma dos dois últimos termos. O número de termos a serem impressos será fornecido pelo usuário, devendo ser um valor inteiro e positivo. Por exemplo, caso o número de termos a serem impressos fornecido pelo usuário seja 7, o programa deverá apresentar como resposta a sequência de valores 1 1 2 3 5 8 13. Caso o usuário forneça um valor inválido para o número de termos, o programa deverá apresentar como resposta o valor -1.

Questão 02

(Aho, 2008) Considere as assertivas a seguir sobre compiladores e interpretadores:

  1. O programa objeto em linguagem de máquina produzido por um compilador normalmente é muito mais rápido no mapeamento de entradas para saídas do que um interpretador.
  2. Um compilador frequentemente oferece um melhor diagnóstico de erro do que um interpretador, pois executa o programa fonte instrução por instrução.
  3. Um interpretador é um tipo comum de processador de linguagem, que em vez que produzir um programa objeto como resultado da tradução, executa diretamente as operações especificadas no programa fonte sobre as entradas fornecidas pelo usuário.
  4. Alguns sistemas de implementação de linguagens são um meio-termo entre os compiladores e os interpretadores, pois traduzem programas em linguagem de alto nível para uma linguagem intermediária projetada para permitir fácil interpretação, sendo mais rápido do que a interpretação pura porque as instruções da linguagem fonte são decodificadas somente uma vez.
  5. A interpretação é um processo fácil de ser implementado, mesmo para programas escritos em uma linguagem complicada, pois o significado de cada expressão e instrução é determinado diretamente do programa-fonte em tempo de execução.

Quantas assertivas estão corretas:

a. 1 assertiva

b. 2 assertivas

c. 3 assertivas

d. 4 assertivas

e. 5 assertivas

Questão 03

(Price, 2005) A construção de analisadores descendentes é auxiliada por duas funções, denominadas FIRST e FOLLOW, associadas a uma gramática G. Durante a análise descendente, as funções FIRST e FOLLOW permitem escolher qual produção deverá ser aplicada, com base no próximo símbolo de entrada. Considerando a gramática livre de contexto G₃, analise as assertivas a seguir:

G₃ = ({S, A, B, C}, {a, b, c, d}, P₃, S)
P₃ = {SABC
A → aA | ε
B → bB | CdA
C → cC | ε}
  1. O conjunto FIRST(S) é {a, b, c, d} e o conjunto FOLLOW(A) é {b, c, d, $}.
  2. O conjunto FIRST(B) é {b, c, d} e o conjunto FOLLOW(S) é {$}.
  3. O conjunto FIRST(B) é {b, c} e o conjunto FOLLOW(C) é {d, $}.
  4. O conjunto FIRST(C) é {c, ε} e o conjunto FOLLOW(B) é {c, d, $}.

Quais das assertivas apresentadas estão corretas?

a. apenas as assertivas I e II.

b. apenas as assertivas I e III.

c. apenas as assertivas II e III.

d. apenas as assertivas II e IV.

e. apenas as assertivas III e IV.

Questão 04

(Aho, 2008) A fatoração à esquerda é uma transformação da gramática útil na produção de gramáticas adequadas para um reconhecedor sintático preditivo, ou descendente. Quando a escolha entre duas ou mais alternativas das produções-A não é clara, ou seja, elas começam com a mesma forma sentencial, podemos reescrever essas produções para adiar a decisão até que tenhamos lido uma cadeia da entrada longa o suficiente para tomarmos a decisão correta. Analise as assertivas a seguir sobre o processo de fatoração à esquerda de gramáticas livre de contexto.

  1. A fatoração à esquerda das produções

    B → xAB | CA | xB

    gera as produções

    B  → xB₁ | CA
    B₁AB | B
  2. A fatoração à esquerda das produções

    D → yzA | y | yz

    gera as produções

    D  → yD₁
    D₁ → zD₂ | ε
    D₂A
  3. A fatoração à esquerda das produções

    C → xy | xDB

    gera as produções

    C  → xC₁
    C₁ → y | DB | ε
  4. A fatoração à esquerda das produções

    ABCy | Bz | BCD

    gera as produções

    ABA₁
    A₁CA₂ | z
    A₂ → y | D

Quais das assertivas apresentadas estão corretas?

a. apenas as assertivas I e II.

b. apenas as assertivas I e III.

c. apenas as assertivas I e IV.

d. apenas as assertivas II e III.

e. apenas as assertivas II e IV.

Questão 05

(Aho, 2008) Uma gramática possui recursão à esquerda se ela tiver um não-terminal A tal que exista uma derivação A+ Aα para alguma cadeia α. Os métodos de análise descendentes não podem tratar gramáticas com recursão à esquerda, de modo que uma transformação é necessária para eliminar essa recursão. Analise as assertivas a seguir sobre o processo de eliminação da recursão à esquerda de gramáticas livre de contexto.

  1. A eliminação da recursão à esquerda das produções

    D → c | DB

    gera as produções

    D  → c | D₁ | cD₁
    D₁B | D₁ | BD₁
  2. A eliminação da recursão à esquerda das produções

    B → a | BC | DC

    gera as produções

    B  → a | DC | aB₁ | DCB₁
    B₁C | CB₁
  3. A eliminação da recursão à esquerda das produções

    B → a | aA | DC | DCA
    D → c | BD

    gera as produções

    B  → a | aA | DC | DCA
    D → c | aD | aAD | cD₁ | aDD₁ | aADD₁
    D₁CD | CAD | CDD₁ | CADD₁
  4. A eliminação da recursão à esquerda das produções

    B → b | bA | CB | CBA
    C → a | b | BB

    gera as produções

    B → b | CB | bA | CBA
    C → a | b | bB | bAB | CBB | CBAB

Quais das assertivas apresentadas estão corretas?

a. apenas as assertivas I e II.

b. apenas as assertivas I e III.

c. apenas as assertivas I e IV.

d. apenas as assertivas II e III.

e. apenas as assertivas II e IV.

Questão 06

(Sebesta, 2000) O escopo de uma variável é a faixa de comandos em que a mesma é visível, ou seja, onde a variável pode ser referenciada por aquele comando. No escopo estático (ou léxico) o escopo de uma variável é determinado através da estrutura textual do programa, enquanto que no escopo dinâmico, o escopo de uma variável é determinado através da linha de execução do programa, sendo dependente, portanto da ordem de execução das rotinas.

public class Test {
private int x, y, z;
public void sub1() { int x, y, c; }
public void sub2() { int x, b, c; }
public void sub3() { int a, b, c; }
public static void main(String[] args) { }
}

Supondo que o pseudoprograma apresentado utilize o escopo dinâmico, considere as assertivas a seguir.

  1. Caso a sequência de chamada seja main chama sub1; sub1 chama sub3 e sub3 chama sub2, as variáveis visíveis durante a execução da última função chamada são y de sub1, x, b e c de sub2, a de sub3 e z de main.
  2. Caso a sequência de chamada seja main chama sub3; sub3 chama sub2 e sub2 chama sub1, as variáveis visíveis durante a execução da última função chamada são x e y de sub1, b e c de sub2, a de sub3 e z de main.
  3. Caso a sequência de chamada seja main chama sub2; sub2 chama sub1 e sub1 chama sub3, as variáveis visíveis durante a execução da última função chamada são x e y de sub1, a, b e c de sub3 e z de main.
  4. Caso a sequência de chamada seja main chama sub1; sub1 chama sub2 e sub2 chama sub3, as variáveis visíveis durante a execução da última função chamada são x e y de sub1, a, b e c de sub3 e z de main.

Quais das assertivas apresentadas estão corretas?

a. apenas as assertivas I e II.

b. apenas as assertivas I e III.

c. apenas as assertivas I e IV.

d. apenas as assertivas II e III.

e. apenas as assertivas II e IV.

Questão 07

(Ricarte, 2008) Um analisador sintático preditivo sem recursão pode ser construído mantendo uma pilha explicitamente, em vez de implicitamente, via chamadas recursivas. O analisador é dirigido por um programa que considera X, o símbolo no topo da pilha, e a, o símbolo corrente da entrada. Se X é um não-terminal, o analisador escolhe uma produção-X consultando a entrada M[X, a] da tabela M de análise. Por outro lado, ele tenta fazer um casamento entre o terminal X no topo da pilha e o símbolo corrente a da entrada. Apresente a sequência de movimentos, com recuperação de erros em modo pânico, da entrada x y z + x z * - y, considerando a tabela M apresentada a seguir.

Tabela de análise preditiva
 +-*/xyz$
AsincsincsincsincACDACDACDsinc
DD → εD → εD → εD → εDABDDABDDABDD → ε
BB → +B → -B → *B → /sincsincsincsinc
CsincsincsincsincC → xC → yC → zsinc
Movimentos do analisador preditivo tabular para x y z + x z * - y
PilhaEntradaDerivação
$ Ax y z + x z * - y $ACD
$ D Cx y z + x z * - y $C → x
$ D xx y z + x z * - y $ 
$ Dy z + x z * - y $DABD
$ D B Ay z + x z * - y $ACD
$ D B D Cy z + x z * - y $C → y
$ D B D yy z + x z * - y $ 
$ D B Dz + x z * - y $DABD
$ D B D B Az + x z * - y $ACD
$ D B D B D Cz + x z * - y $C → z
$ D B D B D zz + x z * - y $ 
$ D B D B D+ x z * - y $D → ε
$ D B D B+ x z * - y $B → +
$ D B D ++ x z * - y $ 
$ D B Dx z * - y $DABD
$ D B D B Ax z * - y $ACD
$ D B D B D Cx z * - y $C → x
$ D B D B D xx z * - y $ 
$ D B D B Dz * - y $DABD
$ D B D B D B Az * - y $ACD
$ D B D B D B D Cz * - y $C → z
$ D B D B D B D zz * - y $ 
$ D B D B D B D* - y $D → ε
$ D B D B D B* - y $B → *
$ D B D B D ** - y $ 
$ D B D B D- y $D → ε
$ D B D B- y $B → -
$ D B D -- y $ 
$ D B Dy $DABD
$ D B D B Ay $ACD
$ D B D B D Cy $C → y
$ D B D B D yy $ 
$ D B D B D$D → ε
$ D B D B$sinc
$ D B D$D → ε
$ D B$sinc
$ D$D → ε
$$aceita

Questão 08

(Price, 2005) Analisadores de precedência de operadores operam sobre a classe das gramáticas de operadores, ou seja, gramáticas que os não-terminais aparecem sempre separados por símbolos terminais e que as produções não derivam a palavra vazia. A análise de precedência de operadores é bastante eficiente e é aplicada, principalmente, no reconhecimento de expressões, como expressões aritméticas e lógicas. Apresente a sequência de movimentos, da entrada (ab(ab(aba)ba)ba), considerando a tabela de precedência e a gramática G₈ apresentados a seguir.

G₈ = ({S, L}, {a, b, (, )}, P₈, S)
P₈ = {S → (L) | a
LLbS | S}
Tabela de precedência de operadores da gramática G₈
 ab()$
a > >>
b<><>>
(<<<= 
) > >>
$<<< aceita
Movimentos do analisador de precedência de operadores para (ab(ab(aba)ba)ba)
PilhaRelaçãoEntradaAçãoHandle
$<(ab(ab(aba)ba)ba)$empilha ( 
$ (<ab(ab(aba)ba)ba)$empilha a 
$ ( a>b(ab(aba)ba)ba)$reduzS → a
$ ( S<b(ab(aba)ba)ba)$empilha b 
$ ( S b<(ab(aba)ba)ba)$empilha ( 
$ ( S b (<ab(aba)ba)ba)$empilha a 
$ ( S b ( a>b(aba)ba)ba)$reduzS → a
$ ( S b ( S<b(aba)ba)ba)$empilha b 
$ ( S b ( S b<(aba)ba)ba)$empilha ( 
$ ( S b ( S b (<aba)ba)ba)$empilha a 
$ ( S b ( S b ( a>ba)ba)ba)$reduzS → a
$ ( S b ( S b ( S<ba)ba)ba)$empilha b 
$ ( S b ( S b ( S b<a)ba)ba)$empilha a 
$ ( S b ( S b ( S b a>)ba)ba)$reduzS → a
$ ( S b ( S b ( S b S>)ba)ba)$reduzLLbS
$ ( S b ( S b ( S=)ba)ba)$empilha ) 
$ ( S b ( S b ( S )>ba)ba)$reduzS → (L)
$ ( S b ( S b S>ba)ba)$reduzLLbS
$ ( S b ( S<ba)ba)$empilha b 
$ ( S b ( S b<a)ba)$empilha a 
$ ( S b ( S b a>)ba)$reduzS → a
$ ( S b ( S b S>)ba)$reduzLLbS
$ ( S b ( S=)ba)$empilha ) 
$ ( S b ( S )>ba)$reduzS → (L)
$ ( S b S>ba)$reduzLLbS
$ ( S<ba)$empilha b 
$ ( S b<a)$empilha a 
$ ( S b a>)$reduzS → a
$ ( S b S>)$reduzLLbS
$ ( S=)$empilha ) 
$ ( S )>$reduzS → (L)
$ S>$aceita