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

Questão 01

Desenvolva um programa na linguagem de programação SIMPLE, que indique se o número fornecido pelo usuário é um número deficiente, perfeito ou abundante.

Um número é considerado deficiente (defectivo) se a soma de seus divisores próprios é menor que o próprio número, como por exemplo o número 15, cuja soma de seus divisores próprios (1 + 3 + 5) é menor do que 15.

Um número é considerado perfeito se a soma de seus divisores próprios é igual ao próprio número, como por exemplo o número 6, cuja soma de seus divisores próprios (1 + 2 + 3) é igual a 6.

Um número é considerado abundante se a soma de seus divisores próprios é maior que o próprio número, como por exemplo o número 12, cuja soma de seus divisores próprios (1 + 2 + 3 + 4 + 6) é maior do que 12.

Caso o número seja considerado deficiente, o programa deverá retornar -1. Caso o número seja considerado perfeito, o programa deverá retornar 0. Caso o número seja considerado abundante, o programa deverá retornar 1. Caso o número fornecido pelo usuário seja menor do que 2, o programa deverá retornar -9.

Considere que a linguagem SIMPLE possua o operador de módulo (%) implementado, que retorne o resto da divisão entre dois números (mesma sintaxe do C/C++ ou Java).

100 input n
105 if n < 2 goto 190
110 let s = 0
115 let a = 1
120 if n <= a goto 150
125 let b = n % a
130 if b != 0 goto 140
135 let s = s + a
140 let a = a + 1
145 goto 120
150 if n <= s goto 165
155 let r = -1
160 goto 195
165 if n == s goto 180
170 let r = 1
175 goto 195
180 let r = 0
185 goto 195
190 let r = -9
195 print r
200 end

Questão 02

Apresente a Análise Preditiva Tabular, com recuperação de erros em modo pânico, da entrada (9 v (w (7 6) y 5) z 4 sobre a gramática a seguir.

G = ({A, B, C, D, E}, {v, w, x, y, z, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, A)
P = {AAvB | B
BBwC | BxC | C
CCyD | CzD | D
D → (A) | E
E → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}

Eliminação da recursividade à esquerda:

G = ({A, A1, B, B1, C, C1, D, E}, {v, w, x, y, z, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, A)
P = {A BA1
A1 → vBA1 | ε
B CB1
B1 → wCB1 | xCB1 | ε
C DC1
C1 → yDC1 | zDC1 | ε
D → (A) | E
E → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}

Conjuntos FIRST(α) e FOLLOW(A):

FIRST(A)  = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(A1) = {v, ε}
FIRST(B) = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(B1) = {w, x, ε}
FIRST(C) = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(C1) = {y, z, ε}
FIRST(D) = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(E) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FOLLOW(A)  = {), $}
FOLLOW(A1) = {), $}
FOLLOW(B) = {v, ), $}
FOLLOW(B1) = {v, ), $}
FOLLOW(C) = {v, w, x, ), $}
FOLLOW(C1) = {v, w, x, ), $}
FOLLOW(D) = {v, w, x, y, z, ), $}
FOLLOW(E) = {v, w, x, y, z, ), $}

Tabela de Análise Preditiva:

Tabela de análise preditiva da gramática G
 vwxyz()0..9$
A     BA1sincBA1sinc
A1vBA1     ε ε
Bsinc    CB1sincCB1sinc
B1εwCB1xCB1   ε ε
Csincsincsinc  DC1sincDC1sinc
C1εεεyDC1zDC1 ε ε
Dsincsincsincsincsinc(A)sincEsinc
Esincsincsincsincsinc sinc0..9sinc
Movimentos do analisador preditivo tabular para (9 v (w (7 6) y 5) z 4
PilhaEntradaDerivação
$ A(9 v (w (7 6) y 5) z 4 $ABA1
$ A1 B(9 v (w (7 6) y 5) z 4 $BCB1
$ A1 B1 C(9 v (w (7 6) y 5) z 4 $CDC1
$ A1 B1 C1 D(9 v (w (7 6) y 5) z 4 $D → (A)
$ A1 B1 C1 ) A ((9 v (w (7 6) y 5) z 4 $ 
$ A1 B1 C1 ) A9 v (w (7 6) y 5) z 4 $ABA1
$ A1 B1 C1 ) A1 B9 v (w (7 6) y 5) z 4 $BCB1
$ A1 B1 C1 ) A1 B1 C9 v (w (7 6) y 5) z 4 $CDC1
$ A1 B1 C1 ) A1 B1 C1 D9 v (w (7 6) y 5) z 4 $DE
$ A1 B1 C1 ) A1 B1 C1 E9 v (w (7 6) y 5) z 4 $E → 9
$ A1 B1 C1 ) A1 B1 C1 99 v (w (7 6) y 5) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1v (w (7 6) y 5) z 4 $C1 → ε
$ A1 B1 C1 ) A1 B1v (w (7 6) y 5) z 4 $B1 → ε
$ A1 B1 C1 ) A1v (w (7 6) y 5) z 4 $A1 → vBA1
$ A1 B1 C1 ) A1 B vv (w (7 6) y 5) z 4 $ 
$ A1 B1 C1 ) A1 B(w (7 6) y 5) z 4 $BCB1
$ A1 B1 C1 ) A1 B1 C(w (7 6) y 5) z 4 $CDC1
$ A1 B1 C1 ) A1 B1 C1 D(w (7 6) y 5) z 4 $D → (A)
$ A1 B1 C1 ) A1 B1 C1 ) A ((w (7 6) y 5) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1 ) Aw (7 6) y 5) z 4 $erro - descartar token da entrada
$ A1 B1 C1 ) A1 B1 C1 ) A(7 6) y 5) z 4 $ABA1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B(7 6) y 5) z 4 $BCB1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C(7 6) y 5) z 4 $CDC1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 D(7 6) y 5) z 4 $D → (A)
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A ((7 6) y 5) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A7 6) y 5) z 4 $ABA1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B7 6) y 5) z 4 $BCB1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1 C7 6) y 5) z 4 $CDC1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 D7 6) y 5) z 4 $DE
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 E7 6) y 5) z 4 $E → 7
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 77 6) y 5) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1 C16) y 5) z 4 $erro - descartar token da entrada
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1) y 5) z 4 $C1 → ε
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1 B1) y 5) z 4 $B1 → ε
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 ) A1) y 5) z 4 $A1 → ε
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 )) y 5) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1y 5) z 4 $C1 → yDC1
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 D yy 5) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 D5) z 4 $DE
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 E5) z 4 $E → 5
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1 55) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1 C1) z 4 $C1 → ε
$ A1 B1 C1 ) A1 B1 C1 ) A1 B1) z 4 $B1 → ε
$ A1 B1 C1 ) A1 B1 C1 ) A1) z 4 $A1 → ε
$ A1 B1 C1 ) A1 B1 C1 )) z 4 $ 
$ A1 B1 C1 ) A1 B1 C1z 4 $C1 → zDC1
$ A1 B1 C1 ) A1 B1 C1 D zz 4 $ 
$ A1 B1 C1 ) A1 B1 C1 D4 $DE
$ A1 B1 C1 ) A1 B1 C1 E4 $E → 4
$ A1 B1 C1 ) A1 B1 C1 44 $ 
$ A1 B1 C1 ) A1 B1 C1$C1 → ε
$ A1 B1 C1 ) A1 B1$B1 → ε
$ A1 B1 C1 ) A1$A1 → ε
$ A1 B1 C1 )$erro - descartar token da pilha
$ A1 B1 C1$C1 → ε
$ A1 B1$B1 → ε
$ A1$A1 → ε
$$sucesso

Simplificação da gramática livre de contexto:

G = ({A, B, C, D}, {v, w, x, y, z, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, A)
P = {AAvB | BwC | BxC | CyD | CzD | (A) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
BBwC | BxC | CyD | CzD | (A) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
CCyD | CzD | (A) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
D → (A) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}

Eliminação da recursividade à esquerda:

G = ({A, A1, B, B1, C, C1, D}, {v, w, x, y, z, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, A)
P = {A BwCA1 | BxCA1 | CyDA1 | CzDA1 | ( A )A1 | 0A1 | 1A1 | 2A1 | 3A1 | 4A1 | 5A1 | 6A1 | 7A1 | 8A1 | 9A1
A1 → vBA1 | ε
B CyDB1 | CzDB1 | (A)B1 | 0B1 | 1B1 | 2B1 | 3B1 | 4B1 | 5B1 | 6B1 | 7B1 | 8B1 | 9B1
B1 → wCB1 | xCB1 | ε
C → (A)C1 | 0C1 | 1C1 | 2C1 | 3C1 | 4C1 | 5C1 | 6C1 | 7C1 | 8C1 | 9C1
C1 → yDC1 | zDC1 | ε
D → (A) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}

Fatoração a esquerda da gramática livre de contexto:

G = ({A, A1, A2, A3, B, B1, B2, C, C1, D}, {v, w, x, y, z, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, A)
P = {A BA2 | CA3 | ( A )A1 | 0A1 | 1A1 | 2A1 | 3A1 | 4A1 | 5A1 | 6A1 | 7A1 | 8A1 | 9A1
A1 → vBA1 | ε
A2 → wCA1 | xCA1
A3 → yDA1 | zDA1
B CB2 | (A)B1 | 0B1 | 1B1 | 2B1 | 3B1 | 4B1 | 5B1 | 6B1 | 7B1 | 8B1 | 9B1
B1 → wCB1 | xCB1 | ε
B2 → yDB1 | zDB1
C → (A)C1 | 0C1 | 1C1 | 2C1 | 3C1 | 4C1 | 5C1 | 6C1 | 7C1 | 8C1 | 9C1
C1 → yDC1 | zDC1 | ε
D → (A) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}

Conjuntos FIRST(α) e FOLLOW(A):

FIRST(A)  = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(A1) = {v, ε}
FIRST(A2) = {w, x}
FIRST(A3) = {y, z}
FIRST(B) = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(B1) = {w, x, ε}
FIRST(B2) = {y, z}
FIRST(C) = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(C1) = {y, z, ε}
FIRST(D) = {(, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FOLLOW(A)  = {), $}
FOLLOW(A1) = {), $}
FOLLOW(A2) = {), $}
FOLLOW(A3) = {), $}
FOLLOW(B) = {v, w, x, ), $}
FOLLOW(B1) = {v, w, x, ), $}
FOLLOW(B2) = {v, w, x, ), $}
FOLLOW(C) = {v, w, x, y, z, ), $}
FOLLOW(C1) = {v, w, x, y, z, ), $}
FOLLOW(D) = {v, w, x, y, z, ), $}

Tabela de Análise Preditiva:

Tabela de análise preditiva da gramática G
 vwxyz()0..9$
A     BA2
CA3
( A )A1
sincBA2
CA3
0..9A1
sinc
A1vBA1     ε ε
A2 wCA1xCA1   ε ε
A3   yDA1zDA1 ε ε
Bsincsincsinc  CB2
(A)B1
sincCB2
0..9B1
sinc
B1εwCB1xCB1   ε ε
B2εεεyDB1zDB1 ε ε
Csincsincsincsincsinc(A)C1sinc0..9C1sinc
C1εεεyDC1zDC1 ε ε
Dsincsincsincsincsinc(A)sinc0..9sinc

A gramática apresentada não é LL(1), pois várias células da Tabela de Análise Preditiva possuem mais de uma produção, de modo que não é possível empregar tal método de análise na presente gramática.

Questão 03

Apresente a Análise de Precedência de Operadores, da entrada 1 v (2 w (3 x 4) y 5) z 6 sobre a gramática a seguir.

G = ({A, B, C, D, E}, {v, w, x, y, z, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, A)
P = {AAvB | B
BBwC | BxC | C
CCyD | CzD | D
D → ( A ) | E
E → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}
Tabela de precedência de operadores da gramática G
 vwxyz()0..9$
v><<<<<><>
w>>><<<><>
x>>><<<><>
y>>>>><><>
z>>>>><><>
(<<<<<<=< 
)>>>>> > >
0..9>>>>> > >
$<<<<<< <aceita
Movimentos do analisador de precedência de operadores para 1 v (2 w (3 x 4) y 5) z 6
PilhaRelaçãoEntradaAçãoHandle
$<1 v (2 w (3 x 4) y 5) z 6 $empilha 1 
$ 1>v (2 w (3 x 4) y 5) z 6 $reduzE → 1
$ A<v (2 w (3 x 4) y 5) z 6 $empilha v 
$ A v<(2 w (3 x 4) y 5) z 6 $empilha ( 
$ A v (<2 w (3 x 4) y 5) z 6 $empilha 2 
$ A v ( 2>w (3 x 4) y 5) z 6 $reduzE → 2
$ A v ( A<w (3 x 4) y 5) z 6 $empilha w 
$ A v ( A w<(3 x 4) y 5) z 6 $empilha ( 
$ A v ( A w (<3 x 4) y 5) z 6 $empilha 3 
$ A v ( A w ( 3>x 4) y 5) z 6 $reduzE → 3
$ A v ( A w ( A<x 4) y 5) z 6 $empilha x 
$ A v ( A w ( A x<4) y 5) z 6 $empilha 4 
$ A v ( A w ( A x 4>) y 5) z 6 $reduzE → 4
$ A v ( A w ( A x A>) y 5) z 6 $reduzBBxC
$ A v ( A w ( A=) y 5) z 6 $empilha ) 
$ A v ( A w ( A )>y 5) z 6 $reduzD → ( A )
$ A v ( A w A<y 5) z 6 $empilha y 
$ A v ( A w A y<5) z 6 $empilha 5 
$ A v ( A w A y 5>) z 6 $reduzE → 5
$ A v ( A w A y A>) z 6 $reduzCCyD
$ A v ( A w A>) z 6 $reduzBBwC
$ A v ( A=) z 6 $empilha ) 
$ A v ( A )>z 6 $reduzD → ( A )
$ A v A<z 6 $empilha z 
$ A v A z<6 $empilha 6 
$ A v A z 6>$ $reduzE → 6
$ A v A z A>$ $reduzCCzD
$ A v A>$ $reduzAAvB
$ Aaceita$  

Questão 04

Considere o seguinte programa C esquemático:

void subA() { int a, b, c, d, e; }
void subB() { int a, b, c, y, z; }
void subC() { int b, c, k, x, y; }
void subD() { int v, w, x, d, e; }
void subE() { int v, w, x, y, z; }

Caso a sequência de chamada seja subA() chama subB(); subB() chama subC(); subC() chama subD() e subD() chama subE(), e supondo-se que seja usado o escopo dinâmico, apresente a situação de cada uma das variáveis presentes no código fonte apresentado, indicando se a mesma está visível ou oculta em cada uma das funções em que foi definida.

Situação de cada uma das variáveis presentes no código fonte
FunçãoVariáveis visíveisVariáveis ocultas
subA() a, b, c, d, e
subB()ab, c, y, z
subC()b, c, kx, y
subD()d, ev, w, x
subE()v, w, x, y, z