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

Que vantagens existem em um sistema de processamento de linguagem no qual o compilador produz linguagem simbólica em vez de linguagem de máquina?
Desenvolva um programa na linguagem de programação SIMPLE, que apresente a somatória dos 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 será fornecido pelo usuário, devendo ser um valor inteiro e positivo. Por exemplo, caso o número de termos fornecido pelo usuário seja 7, o programa deverá apresentar como resposta o valor 33, ou seja, 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. Posteriormente, apresente a identificação de todos os tokens utilizados na elaboração do programa.

Apresente os conjuntos FIRST e FOLLOW das variáveis da gramática a seguir.

G = ({S, A, B, C}, {a, b, c, d}, P, S)
P = {SABC
     A → aA | ε
     B → bB | CdA
     C → cC | ε}

Questão 04

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 I e II 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 */

A partir dessas informações, assinale a opção correta:

  1. A identificação e a comunicação do erro em qualquer uma das sentenças são funções do analisador léxico.
  2. O compilador não tem meios para identificar e relatar erros como o da sentença I.
  3. A identificação e a comunicação do erro na sentença I são funções da geração de código intermediário.
  4. A identificação e a comunicação do erro na sentença II são funções do analisador léxico.
  5. A identificação e a comunicação do erro na sentença II são funções da análise semântica.

Elimine a recursividade à esquerda, considerando a palavra vazia, das produções da gramática a seguir.

G = ({A, B, C, D}, {x, y, z, w}, P, A)
P = {AAxC | Byw | ACz
     BCyz | yBz | BAC
     C → xDy | Dw
     D → xDx | yDy | Dz | Dw}

Elimine a recursividade à esquerda, desconsiderando a palavra vazia, das produções da gramática a seguir.

G = ({A, B, C, D}, {x, y, z, w}, P, A)
P = {AAxC | Byw | ACz
     BCyz | yBz | BAC
     C → xDy | Dw
     D → xDx | yDy | Dz | Dw}

Apresente a tabela de Análise de Precedência de Operadores, com tratamento de erros, da gramática a seguir.

G = ({A, B, C, D}, {id, +, -, *, /, (, )}, P, A)
P = {AA+B | A-B | B
     BB/C | C
     CC*D | D
     D → (A) | id}

Apresente a Análise Preditiva Tabular da entrada (id + id) * (id + id) sobre a gramática a seguir.

G = ({A, B, C, D, E}, {id, +, *, (, )}, P, A)
P = {ACB
     B → +CB | ε
     CED
     D → *ED | ε
     E → (A) | id}

Questão extra

Analise as seguintes afirmativas sobre os parsers descendentes recursivos.

  1. São parsers fáceis de implementar para linguagens cuidadosamente projetadas, porém geralmente exigem transformações em gramáticas originalmente apresentadas em BNF.
  2. Um dos principais problemas desse tipo de parser é a necessidade de retrocesso nas alternativas, o que pode ser resolvido com o uso de um parser recursivo preditivo.
  3. Para evitar os problemas do parser descendente recursivo, podemos realizar a análise TOP-DOWN usando um parser preditivo não recursivo, ou parser preditivo tabular. O parser preditivo tabular usa uma tabela baseada nos conjuntos FIRST e FOLLOW para decidir qual produção aplicar à entrada.

A análise permite concluir que:

  1. apenas a afirmativa I está correta.
  2. apenas a afirmativa II está correta.
  3. apenas a afirmativa III está correta.
  4. apenas as afirmativas I e II estão corretas.
  5. as três afirmativas estão corretas.