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

Questão 01

A identificação e o tratamento de erros em programas de computador estão entre as tarefas dos compiladores. Os erros de um programa podem ter variados tipos e precisam ser identificados e tratados em diferentes fases da compilação. Considere uma linguagem de programação que exige que as variáveis manipuladas por seus programas sejam previamente declaradas, não podendo haver duplicidade de identificadores para variáveis em um mesmo escopo. Considere, ainda, que a sintaxe dessa linguagem tenha sido definida por meio de uma gramática livre de contexto e as produções seguintes definam a forma das declarações de variáveis em seus programas.

DTL; | TL;D
T → int | real | char
L → id | id,L

Considere os exemplos de sentenças apresentadas a seguir, com a indicação entre os delimitadores /* e */ de diferentes tipos de erros.

  1. int: a, b; /* dois pontos após a palavra int */
  2. int a, b; real a; /* declaração dupla da variável a */
  3. char a; b; /* ausência do tipo da variável b */

A partir dessas informações, assinale as assertivas a seguir:

  1. A identificação e a comunicação do erro na sentença 1 são funções do analisador sintático.
  2. A identificação e a comunicação do erro na sentença 1 são funções do analisador semântico.
  3. A identificação e a comunicação do erro na sentença 2 são funções do analisador sintático.
  4. A identificação e a comunicação do erro na sentença 2 são funções do analisador semântico.
  5. A identificação e a comunicação do erro na sentença 3 são funções do analisador sintático.
  6. A identificação e a comunicação do erro na sentença 3 são funções do analisador semântico.

Quais das assertivas apresentadas estão corretas?

a. apenas as assertivas I, III e VI.

b. apenas as assertivas I, IV e V.

c. apenas as assertivas I, IV e VI.

d. apenas as assertivas II, III e VI.

e. apenas as assertivas II, IV e V.

Questão 02

(POSCOMP, 2017) A tarefa principal de um analisador léxico consiste em ler os caracteres da entrada do programa-fonte, agrupá-los em lexemas e gerar uma sequência de tokens que será enviada ao analisador sintático. Sobre o analisador léxico, analise as assertivas abaixo:

  1. Além da identificação de lexemas, outras tarefas podem ser realizadas por esse analisador, tais como: remoção de comentários e espaços em branco e a associação de mensagens de erros às linhas do programa-fonte.
  2. Token é a unidade básica do texto-fonte. Pode ser representado por três informações: a classe do token, que representa o tipo do token reconhecido, o valor do token, que é o texto do lexema reconhecido e a posição que indica o local do texto-fonte (linha e coluna) onde ocorreu o token.
  3. Expressões regulares e geradores de analisadores léxicos são notações utilizadas para especificar os padrões de lexemas.
  4. Na análise léxica, uma representação intermediária do tipo árvore é criada. Esta apresenta a estrutura gramatical da sequência de tokens.

Quais das assertivas apresentadas estão corretas?

a. apenas a assertiva I.

b. apenas a assertiva II.

c. apenas a assertiva IV.

d. apenas as assertivas I e II.

e. apenas as assertivas III e IV.

Questão 03

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. Considere o programa escrito na linguagem de programação SIMPLE a seguir.

10 input n
15 if n > 0 goto 30
20 let m = -1
25 goto 70
30 let s = 0
35 let i = 1
40 if i > n goto 65
45 let a = i * i
50 let s = s + a
55 let i = i + 1
60 goto 40
65 let m = s / n
70 print m
75 end

Caso a entrada fornecida pelo usuário seja 6, o programa apresentará como resposta:

a. 4

b. 7

c. 11

d. 15

e. 20

Questão 04

Considere o pseudoprograma apresentado a seguir, escrito na linguagem de programação Java.

public class Test {
private int x, y, z, w;
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) { }
}

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

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

(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(B) é {c}.
  2. O conjunto FIRST(A) é {a, ε} e o conjunto FOLLOW(C) é {d, $}.
  3. O conjunto FIRST(B) é {b, c} e o conjunto FOLLOW(S) é {$}.
  4. O conjunto FIRST(C) é {c, ε} e o conjunto FOLLOW(A) é {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 06

(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 para o reconhecimento da entrada x y z z y x, considerando a tabela M apresentada a seguir.

Tabela de análise preditiva
 xyz$
AA → xB   
B BDC  
CC → xCC → yCC → zCC → ε
D D → yE  
E  EGF 
FF → xFF → yFF → zFF → ε
G  G → z 
Movimentos do analisador preditivo tabular para x y z z y x
PilhaEntradaDerivação
$ Ax y z z y x $A → xB
$ B xx y z z y x $ 
$ By z z y x $BDC
$ C Dy z z y x $D → yE
$ C E yy z z y x $ 
$ C Ez z y x $EGF
$ C F Gz z y x $G → z
$ C F zz z y x $ 
$ C Fz y x $F → zF
$ C F zz y x $ 
$ C Fy x $F → yF
$ C F yy x $ 
$ C Fx $F → xF
$ C F xx $ 
$ C F$F → ε
$ C$C → ε
$$aceita

Questão 07

(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 tabela de precedência de operadores da gramática apresentada a seguir.

G = ({S, T, F, P}, {?, @, &, a, (, )}, P, S)
P = {SS?T | T
TT@F | F
FF&P | P
P → a | (S)}
Tabela de análise preditiva
 ?@&a()$
?><<<<>>
@>><<<>>
&>>><<>>
a>>>  >>
(<<<<<= 
)>>>  >>
$<<<<< aceita

Questão 08

Considerando a tabela de precedência de operadores elaborada na Questão 07, apresente a sequência de movimentos para o reconhecimento da entrada a&a@(a?a).

Movimentos do analisador de precedência de operadores para a&a@(a?a)
PilhaRelaçãoEntradaAçãoHandle
$<a&a@(a?a)$empilha a 
$ a>&a@(a?a)$reduzP → a
$ S<&a@(a?a)$empilha & 
$ S &<a@(a?a)$empilha a 
$ S & a>@(a?a)$reduzP → a
$ S & S>@(a?a)$reduzFF&P
$ S<@(a?a)$empilha @ 
$ S @<(a?a)$empilha ( 
$ S @ (<a?a)$empilha a 
$ S @ ( a>?a)$reduzP → a
$ S @ ( S<?a)$empilha ? 
$ S @ ( S ?<a)$empilha a 
$ S @ ( S ? a>)$reduzP → a
$ S @ ( S ? S>)$reduzSS?T
$ S @ ( S=)$empilha ) 
$ S @ ( S )>$reduzP → (S)
$ S @ S>$reduzTT@F
$ Saceita$