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

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 o menor 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 4, que é o menor número entre os três números fornecidos pelo usuário.

Questão 02

(POSCOMP, 2015) Em um texto fonte de linguagem de programação, o compilador realiza a identificação da função gramatical das palavras, a verificação da estrutura gramatical dos comandos e dos seus significados. Os componentes arquiteturais de um compilador que realizam essas atividades são, respectivamente:

a. analisador léxico, analisador semântico, otimizador de código intermediário.

b. analisador léxico, analisador sintático, analisador semântico.

c. analisador sintático, gerador de código, analisador semântico.

d. analisador semântico, gerador de código intermediário, otimizador de código intermediário.

e. analisador sintático, analisador semântico, gerador de código.

Questão 03

(POSCOMP, 2016) Durante a análise sintática, erros podem ser detectados na sintaxe do programa fonte. Nesse caso, alguns compiladores podem reportar o erro e interromper a análise. Outros reportam o erro, mas, também, realizam uma recuperação do erro e tentam continuar a fase de análise, entretanto, a fase de síntese é desativada. Nesse sentido, analise as assertivas a seguir:

  1. Um recuperador de erros para um analisador sintático deve informar a presença de erros de forma clara e recuperar-se de maneira que consiga continuar a fase de análise sem se preocupar com o custo de processamento para tal atividade.
  2. O modo pânico é uma forma de recuperação de erro na qual o analisador despreza símbolos da entrada até que um token sincronizante seja encontrado.
  3. Erros sintáticos incluem divergências de tipo entre operadores e operandos.
  4. Na recuperação em nível de frase ou local, há a alteração sobre um símbolo que pode ser feita: pela substituição, inserção ou exclusão de token de entrada.

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

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. Considerando o programa abaixo, elaborado na sintaxe da linguagem de programação Java, analise as assertivas a seguir:

public class Test {
private int x = 10, y = 15;

public void sub1() {
int x = 20;
sub4();
}

public void sub2() {
int y = 35;
sub3();
}

public void sub3() {
int x = 40;
sub1();
}

public void sub4() {
System.out.println(x + ":" + y);
}

public static void main(String[] args) {
int y = 55;
Test test = new Test();
test.sub2();
}
}
  1. A saída do programa será 10:15 considerando a aplicação das regras do escopo estático.
  2. A saída do programa será 10:55 considerando a aplicação das regras do escopo estático.
  3. A saída do programa será 20:35 considerando a aplicação das regras do escopo dinâmico.
  4. A saída do programa será 40:55 considerando a aplicação das regras do escopo dinâmico.

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

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 G5, analise as assertivas a seguir:

G5 = ({A, B, C, D, E, F, G}, {x, y, z}, P5, A)
P5 = {A → xB
BDC
C → xC | yC | zC | ε
D → yE
EGF
F → xF | yF | zF | ε
G → z}
  1. O conjunto FIRST(B) é {y} e o conjunto FOLLOW(A) é {ε}.
  2. O conjunto FIRST(C) é {x, y, z, ε} e o conjunto FOLLOW(D) é {x, y, z, $}.
  3. O conjunto FIRST(E) é {z} e o conjunto FOLLOW(C) é {$}.
  4. O conjunto FIRST(E) é {z} e o conjunto FOLLOW(G) é {x, y, z}.

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

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 para a gramática livre de contexto G5, reapresentada a seguir:

G5 = ({A, B, C, D, E, F, G}, {x, y, z}, P5, A)
P5 = {A → xB
BDC
C → xC | yC | zC | ε
D → yE
EGF
F → xF | yF | zF | ε
G → z}
Tabela de análise preditiva da gramática G5
 xyz$
AA → xB   
B BDC  
CC → xCC → yCC → zCC → ε
D D → yE  
E  EGF 
FF → xFF → yFF → zFF → ε
G  G → z 

Questão 07

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 da entrada x y z y x, considerando a tabela M obtida na Questão 06.

Movimentos do analisador preditivo tabular para (id + id) * (id + id)
PilhaEntradaDerivação
$ Ax y z y x $A → xB
$ B xx y z y x $ 
$ By z y x $BDC
$ C Dy z y x $D → yE
$ C E yy z y x $ 
$ C Ez y x $EGF
$ C F Gz y x $G → z
$ 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 08

A estratégia de análise sintática por deslocamento e redução é baseada na técnica de reconhecimento de sentenças por construção ascendente. Nessa estratégia, símbolos terminais da sentenças são lidos um a um; a cada símbolo lido, o analisador decide se prossegue com a leitura (desloca) ou se é possível aplicar uma produção aos símbolos previamente lidos para substituí-los por um símbolo não-terminal da gramática (reduz). O procedimento conclui com sucesso se toda a sentença foi lida e apenas o símbolo sentencial resulta da aplicação de todas as reduções. Nesse sentido, analise as assertivas a seguir sobre analisadores de precedência de operadores, uma classe de analisadores baseados na análise redutiva:

  1. A gramática livre do contexto G8 é uma gramática de operadores.
    G8 = ({A, B}, {x, +, -, (, )}, P8, A)
    P8 = {AABA | (A) | x
    B → + | -}
  2. Seja a o terminal mais ao topo da pilha e b o primeiro terminal da cadeia de entrada sendo analisada. Se a > b então se procura o lado direito de handle na pilha e o substitui pelo seu lado esquerdo.
  3. Para identificar os handles (substituições) utilizam-se relações de precedência existentes entre os símbolos terminais (operandos e operadores) e não-terminais (variáveis) em uma tabela sintática ou de precedência.
  4. Na análise de precedência de operadores, existem dois momentos nos quais o analisador pode descobrir erros sintáticos: a) na consulta à matriz de precedência, quando não existe relação de precedência entre o terminal mais ao topo da pilha e o símbolo da entrada; b) quando o analisador supõe a existência de um handle no topo da pilha, mas não existe produção com o lado direito correspondente.

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.