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

Questão 01

(vale 1,0 ponto) Desenvolva um programa na linguagem de programação SIMPLE, que apresente o mínimo múltiplo comum (MMC) entre dois números. Por exemplo, caso os valores fornecidos pelo usuário sejam 12 e 45, o programa deverá apresentar como resposta o valor 180. Caso o usuário forneça valores inválidos, o programa deverá apresentar como resposta o valor -1.

10 input a
15 if a <= 0 goto 65
20 input b
25 if b <= 0 goto 65
30 let p = a * b
35 let r = a % b
40 let a = b
45 let b = r
50 if r != 0 goto 35
55 let x = p / a
60 goto 70
65 let x = -1
70 print x
75 end

Questão 02

(vale 1,0 ponto) 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 = {SAC | CdB | Ba
A → aA | BC
B → bB | CB
C → cC | ε}
  1. O conjunto FIRST(B) é {b, c} e o conjunto FOLLOW(C) é {a, b, c, d, $}.
  2. O conjunto FIRST(A) é {a, b, c, ε} e o conjunto FOLLOW(B) é {a, c, $}.
  3. O conjunto FIRST(S) é {a, b, c, d} e o conjunto FOLLOW(B) é {a, c, $}.
  4. O conjunto FIRST(A) é {a, b, c} e o conjunto FOLLOW(C) é {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 03

(vale 1,0 ponto) 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. 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 as transformações 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₂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 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

    D → c | DB

    gera as produções

    D  → c | D₁ | cD₁
    D₁B | D₁ | BD₁

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

(vale 1,0 ponto) Considere o pseudoprograma apresentado a seguir, escrito na linguagem de programação Java.

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

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 sub4; sub4 chama sub2 e sub2 chama sub1, as variáveis visíveis durante a execução da última função chamada são x de main, a, y, z e w de sub1 e b, c e d de sub4.
  2. Caso a sequência de chamada seja main chama sub3; sub3 chama sub2 e sub2 chama sub4, as variáveis visíveis durante a execução da última função chamada são x e y de main, z e w de sub2 e a, b, c e d de sub4.
  3. Caso a sequência de chamada seja main chama sub2; sub2 chama sub4 e sub4 chama sub1, as variáveis visíveis durante a execução da última função chamada são x de main, a, y, z e w de sub1, b de sub2 e c e d de sub4.
  4. 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 x de main, y de sub1, a, b, z e w de sub2 e c de sub3.

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 05

(vale 1,0 ponto) 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. Considerando a tabela de precedência de operadores apresentada a seguir, apresente a sequência de movimentos para o reconhecimento da entrada a ∨ (b d) ⊕ e.

G = ({A, B, C, D, E, F}, {∨, ⊕, &, (, ), a, b, c, d, e}, P, A)
P = {ABA | B
BCB | C
CD & C | D
D → ( A ) | E
E → a | b | c | d | e}
Tabela de precedência de operadores da gramática G
 &()a..e$
><<<><>
>><<><>
&>>><><>
(<<<<=<erro 1
)>>>erro 2>erro 2>
a..e>>>erro 2>erro 2>
$<<<<erro 3<aceita

Erros na consulta a matriz:

erro 1 - empilha ) e emite a mensagem: falta de parêntese à direita.

erro 2 - insere na entrada e emite a mensagem: operador esperado.

erro 3 - descarta ) da entrada e emite a mensagem: parêntese direito ilegal.

Erros na redução do handle:

erro 4 - se , ou & definem um handle, verificar se existem variáveis em ambos os lados do operador. Em caso negativo, executar a redução e emitir a mensagem: falta expressão.

erro 5 - se o par ( ) deve ser reduzido, verificar se existe uma variável entre os parênteses. Em caso negativo, executar a redução e emitir a mensagem: expressão nula entre parênteses.

Movimentos do analisador de precedência de operadores para a ∨ (b d) ⊕ e
PilhaRelaçãoEntradaAçãoHandle
$<a ∨ (b d) ⊕ e $empilha a 
$ a> (b d) ⊕ e $reduzE → a
$ A< (b d) ⊕ e $empilha ∨ 
$ A <(b d) ⊕ e $empilha ( 
$ A(<b d) ⊕ e $empilha b 
$ A ∨ ( berro 2d) ⊕ e $insere ∨ 
$ A ∨ ( b> d) ⊕ e $reduzE → b
$ A( A< d) ⊕ e $empilha ∨ 
$ A ∨ ( A <d) ⊕ e $empilha d 
$ A ∨ ( Ad>) ⊕ e $reduzE → d
$ A ∨ ( A A>) ⊕ e $reduzABA
$ A( A=) ⊕ e $empilha ) 
$ A ∨ ( A )> e $reduzD → ( A )
$ A A< e $empilha ⊕ 
$ AA <e $empilha e 
$ AAe>$ $reduzE → e
$ AA A>$ $reduzBCB
$ A A>$ $reduzABA
$ Aaceita$  

Questão 06

(vale 1,0 ponto) 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 D/ z * - y + $D → ε
$ D B D B/ z * - y + $B → /
$ D B D // z * - y + $ 
$ D B Dz * - y + $DABD
$ D B D B Az * - y + $ACD
$ D B D B D Cz * - y + $C → z
$ D B D B D zz * - y + $ 
$ D B D B D* - y + $D → ε
$ D B D B* - y + $B → *
$ D B D ** - y + $ 
$ D B D- y + $D → ε
$ D B- y + $B → -
$ D -- y + $ 
$ Dy + $DABD
$ D B Ay + $ACD
$ D B D Cy + $C → y
$ D B D yy + $ 
$ D B D+ $D → ε
$ D B+ $B → +
$ D ++ $ 
$ D$D → ε
$$aceita

Questão Extra

(vale 1,0 ponto) Os analisadores sintáticos preditivos, ou seja, os analisadores de descida recursiva que não precisam de retrocesso, podem ser construídos para uma classe de gramáticas chamada LL(1). O primeiro L em LL(1) significa que a cadeia de entrada é lida da esquerda para a direita, o segundo L representa uma derivação mais à esquerda e o 1 pelo uso de um símbolo à frente na entrada utilizado em cada passo para tomar as decisões quanto à ação de análise. Apresente a tabela M de análise preditiva tabular, com recuperação de erros em modo pânico, para a gramática livre de contexto G, apresentada a seguir:

G = ({A, B, C, D, E, F, G}, {x, y, z}, P, A)
P = {A → zB
BDC
C → xC | yC | zC | ε
D → yE
EGF
F → xF | yF | zF | ε
G → x}

Eliminação de Recursividade à Esquerda

G = ({A, B, C, D, E, F, G}, {x, y, z}, P, A)
P = {A → zB
BDC
C → xC | yC | zC | ε
D → yE
EGF
F → xF | yF | zF | ε
G → x}

Fatoração à Esquerda

G = ({A, B, C, D, E, F, G}, {x, y, z}, P, A)
P = {A → zB
BDC
C → xC | yC | zC | ε
D → yE
EGF
F → xF | yF | zF | ε
G → x}

Conjuntos FIRST(α) e FOLLOW(A)

FIRST(A) = {z}
FIRST(B) = {y}
FIRST(C) = {x, y, z, ε}
FIRST(D) = {y}
FIRST(E) = {x}
FIRST(F) = {x, y, z, ε}
FIRST(G) = {x}
FOLLOW(A) = {$}
FOLLOW(B) = {$}
FOLLOW(C) = {$}
FOLLOW(D) = {x, y, z, $}
FOLLOW(E) = {x, y, z, $}
FOLLOW(F) = {x, y, z, $}
FOLLOW(G) = {x, y, z, $}
Tabela de análise preditiva
 xyz$
A  A → zBsinc
B BDC sinc
CC → xCC → yCC → zCC → ε
DsincD → yEsincsinc
EEGFsincsincsinc
FF → xFF → yFF → zFF → ε
GG → xsincsincsinc