Você está na página 1de 7

PERGUNTA 1

Para o desenvolvimento de um compilador é possível que se adote um dos diferentes


modelos de construção. Um destes é o que chamamos de modelo de múltiplas passagens,
em que as atividades relacionadas a tradução e a escrita do código alvo são
realizadas em etapas encadeadas. Cada fase realiza sua tarefa percorrendo todo o
código fonte e, após uma conclusão bem-sucedida, inicia-se a etapa subsequente
tendo como entrada o resultado da fase anterior. Acerca deste modelo analise as
seguintes considerações.
- Trata-se de um modelo bastante didático, pois a modularização do processo permite
o desenvolvimento gradativo do compilador enquanto se estuda com mais detalhes as
atividades pertinentes a cada etapa.
- Por outro lado, uma desvantagem inerente ao modelo é que por exemplo um erro
semântico localizado nas primeiras linhas do código fonte somente seria detectado
após a conclusão das análises léxica e sintática de todas as linhas do programa.
Assinale a alternativa que representa o melhor juízo cabível sobre o que se
afirmou.

a.
Ambas as assertivas são verdadeiras, sendo a segunda a justificativa da primeira.

b.
Ambas as assertivas são verdadeiras e não apresentam relação de causa e
consequência entre elas.

c.
Apenas a primeira assertiva é verdadeira, pois sendo um modelo didático deveria
apresentar boa eficiência no processamento.

d.
Apenas a segunda assertiva é verdadeira, pois este modelo é o mais utilizado no
desenvolvimento de compiladores comerciais dada a sua flexibilidade de reuso dos
módulos.

e.
Ambas as assertivas são falsas, pois o modelo não pode ser considerado didático
tampouco o exemplo dado na segunda asserção representaria uma debilidade.

0,5 pontos

PERGUNTA 2

Um analisador sintático LL(1) somente pode ser construído para uma classe restrita
de gramáticas, que também recebem este mesmo nome. Uma de suas características é
que suas produções não apresentem prefixos comuns para cadeias distintas derivadas
a partir de um mesmo não-terminal. Ou seja, se duas produções que começam com o
mesmo símbolo ou conjunto de símbolos (prefixo), por exemplo, como nas regras A→αβ
e A→αδ e sendo First(α) ≠ ∅, implicará numa interseção entre os conjuntos First(αβ)
e First(αδ) e o analisador não será capaz de decidir qual regra escolher utilizando
um único símbolo da entrada. Usualmente o problema pode ser resolvido substituindo
as produções da gramática que causam o problema por outras que acomodem essa
restrição, mantendo a equivalência entre elas. Supondo a produção S → if E then S
else S fi | if E then S fi | K e considerando ε como a sentença vazia, quais dentre
as alternativas a seguir representa uma substituição válida para resolver o
problema apresentado e obter uma gramática equivalente que seja LL(1)?.

a.
S → if E then S R fi | K
R → else S | ε
b.
S → if E then S R
R → else S fi | ε

c.
S → if E then R fi
R → S else S | K

d.
S → if E then S R
R → else S fi | if E then S fi | K

e.
S → if E then R fi | ε
R → S | else S | K

0,5 pontos

PERGUNTA 3

O processo de programar um computador para realizar uma determinada tarefa, quando


analisado em relação às atividades que são necessárias desde a codificação do
algoritmo até a execução propriamente dita do programa, pode ser visto como um
processo complexo e que envolve vários elementos, cada qual com propósito bastante
específico. Nesse contexto, assinale a alternativa que descreve o propósito e a
principal tarefa realizada pelos compiladores.

a.
Facilitar a programação de computadores, pois oferecem recursos que possibilitam a
escrita do código (edição de textos), assim funcionalidades ligadas a execução e
depuração (debug).

b.
Possibilitar a programação de computadores utilizando linguagens de alto nível (que
permitem descrever as ideias em termos mais abstratos e mais independentes da
arquitetura da máquina), pois são responsáveis pela tradução do algoritmo em seu
correspondente em um linguagem de baixo nível.

c.
Auxiliar na tarefa de desenvolvimento, permitindo a criação de programas com menos
erros. Para isso, devem oferecer recursos tais como. Auto completar para comandos,
verificação de declarações de variáveis, inícios e términos de blocos, além de
outras verificações estruturais.

d.
Apoiar o processo de desenvolvimento portável, oferecendo tradução do código para
diferentes arquiteturas e plataformas.

e.
Permitir que as atividades ligadas a programação de computadores sejam realizadas
em um ambiente integrado, provendo recursos relacionados desde a escrita do código
até a sua execução no sistema operacional.

0,5 pontos

PERGUNTA 4
Os diferentes elementos básicos que compõe uma linguagem, tais como as palavras
reservadas, identificadores, operadores e quaisquer outros lexemas estabelecidos
por ela, também possuem uma estrutura sintática e podem ser descritos formalmente
através de expressões regulares. Entretanto a tarefa de reconhecimento dos lexemas
é realizada pelo Analisador Léxico, acontecendo de maneira separada da Análise
Sintática do código.
Assim, um analisador léxico é antes de mais nada um elemento reconhecedor destas
estruturas e pode ser definido como um autômato finito, dada a natureza regular dos
elementos da linguagem.
Julgue cada uma das afirmativas a seguir e assinale a alternativa correta.
I) As gramáticas regulares não permitem a descrição de estruturas aninhadas e
portanto não são capazes de descrever simultaneamente os lexemas e também as demais
estruturas típicas nas linguagem de programação, tais como parênteses balanceados e
comandos aninhados.
II) A separação das etapas permite utilizar gramaticas regulares, que são mais
simples e mais eficientes, para a descrição dos lexemas tornado a implementação do
reconhecedor mais fácil.
III) O analisador sintático ficaria muito mais complexo, pois estaria a todo
momento preocupado em prever a ocorrência de símbolos irrelevantes, tais como
espaços em branco, que teriam sido eliminados pela análise léxica.

a.
Apenas o item I é verdadeiros, justificando a separação dos analisadores.

b.
Apenas os itens I e III são verdadeiros, mas o item iii não justifica a separação
dos analisadores.

c.
Apenas os itens I e II são verdadeiros, mas apenas o item ii justifica a separação
dos analisadores.

d.
Todos itens são verdadeiros, mas nenhum deles justificam a separação dos
analisadores.

e.
Todos itens são verdadeiros e os motivos apresentados justificam a separação dos
analisadores.

0,5 pontos

PERGUNTA 5

Um processo algorítmico tem o objetivo de instruir o executor quanto às ações que


deve realizar e a sua sequência. Para que isso ocorra é necessário que as
instruções sejam dadas num formato compreensível àquele que as realizará. A
programação de computadores é feita descrevendo o algoritmo em instruções de uma
linguagem de programação e que, quando ditas de alto nível, apresentam
características mais próximas à estrutura das linguagens humanas do que a das
máquinas. Analise as alternativas a seguir e assinale a que julgar incorreta.

a.
Quando a linguagem de codificação do algoritmo é de alto nível, precisamos de um
compilador para que o algoritmo original seja traduzido para um equivalente dado em
linguagem de baixo nível.

b.
A construção de compiladores envolve conhecimentos relativos à estrutura da
linguagem e à capacidade de tradução de uma para outra, preservando fielmente cada
uma das funcionalidades descritas no código fonte.

c.
O uso de métodos formais permite tanto a especificação das linguagens de
programação quanto a implementação de reconhecedores para as suas estruturas,
compreendendo assim os fundamentos teóricos para o estudo e a construção de
compiladores.

d.
Os conhecimentos relacionados à construção de compiladores encerram-se estritamente
nesta atividade, oferecendo pouco ou mesmo nenhuma possibilidade de aplicação em
outras áreas que não seja a tradução para linguagem de máquina.

e.
A compreensão das estruturas de uma linguagem e dos processos que envolvem a sua de
interpretação permite que tais conhecimentos sejam aplicados não apenas na
construção de compiladores, mas também na interpretação de documentos estruturados,
com as páginas da web; parâmetros em linhas de comandos ou padrões de endereços na
web, por exemplo.

0,5 pontos

PERGUNTA 6

Um analisador sintático descendente constrói a árvore de derivação do programa de


cima para baixo, isto é, partindo da raiz (símbolo inicial da gramática) e seguindo
em direção as folhas (símbolos do programa). Todos os métodos que adotam esta
estratégia seguem esta abordagem, variando pontualmente a forma como resolvem o
problema de selecionar a regra a ser aplicada em cada momento. Pode-se afirmar
sobre o Analisador Descendente Recursivo:

a.
É um reconhecedor obtido através da transcrição das regras de produção da gramática
na forma de um conjunto de sub-rotinas. Assim, cada sub-rotina é responsável por
verificar os elementos relativos a uma produção em particular. O processo de
reconhecimento se inicia com a chamada da sub-rotina equivalente a regra que deriva
o símbolo inicial da gramática. A partir disto, chamadas subsequentes para outras
sub-rotinas são realizadas sempre que um símbolo não terminal é encontrado na
produção. Quando todos os elementos são consumidos, a chamada inicial retorna
sinalizando que se trata de uma sentença é válida.

b.
Consiste no uso de uma tabela de movimentos que determina quais regras de produção
devem ser utilizadas em cada momento do processo. A análise tem início aplicando a
regra dada na primeira entrada da tabela e termina quando todos os elementos da
entrada forem consumidos pelo analisador.

c.
Diferencia-se de outros métodos descendentes por iniciar o processo de análise
através de uma operação recursiva de empilhamento, em que cada token do programa é
colocado em uma estrutura de dados para processamento posterior. A seguir, os
símbolos são um a um desempilhados e confrontados com a sequência esperada na
derivação mais à direita (right-most) invertida.

d.
Trata-se de um dos métodos descendentes mais eficientes e amplamente adotado no
desenvolvimento de compiladores comerciais, pois seu caráter recursivo permite a
análise recorrente das estruturas sintáticas da linguagem de maneira ótima além de
consumir pouco recurso computacional. Adicionalmente, dada a capacidade de ser
aplicado a qualquer tipo de gramática, é considerado um modelo universal.

e.
É considerado apenas um modelo teórico, pois os procedimentos recursivos são úteis
apenas para a compreensão e formulação de problemas. Dentro da computação os
algoritmos recursivos são os mais complexos e difíceis de serem compreendidos,
tornando impossível a implementação de um reconhecedor sintático que use esta
técnica.

0,5 pontos

PERGUNTA 7

Assinale a alternativa que representa a principal tarefa realizada pela Análise


léxica.

a.
Ler o conteúdo do arquivo fonte, caractere a caractere, agrupando-os em palavras de
acordo com a separação dada pelos espaços em branco do texto.

b.
Percorrer o arquivo fonte, palavra por palavra, analisando sua disposição e ordem
em relação a estrutura da linguagem.

c.
Varrer o arquivo fonte, lendo-o caractere por caractere e agrupá-los em blocos de
um ou mais elementos de acordo com o significado dentro da linguagem.

d.
Reconhecer os elementos utilizados como identificadores, verificando o seu tipo e
validando sua compatibilidade em expressões.

e.
Eliminar elementos irrelevantes ao processo, tais como. comentários, macros e
referências de caminhos para bibliotecas (path).

0,5 pontos

PERGUNTA 8

No modelo de Análise e Síntese o processo é dividido em duas grandes etapas. Na


primeira, são realizadas todas as tarefas pertinentes a análise e compreensão do
código fonte, enquanto na segunda, as atividades de otimização e a geração do
código propriamente dito. Cada uma destas grandes etapas pode ser decompostas em
fases, de propósito específico e cujo resultado de seu processamento servirá como
dado de entrada para a próxima fase. Analise as alternativas a seguir e assinale
aquela cuja atividade não corresponde a nenhuma das subfases deste modelo.

a.
Durante a análise léxica o compilador varre o código fonte em busca dos lexemas da
linguagem (isto é, caracteres que, expressos de modo simples ou combinados,
apresentam relevância na linguagem), compondo estas sequência de caracteres em
blocos chamados tokens.

b.
Na análise sintática são verificadas as estruturas gramaticais do código, como por
exemplo, a sintaxe dos comandos e o emprego correto dos operadores. Os tokens que
compõem o código fonte são verificados quanto a sequência em que aparecem e se
todos os elementos esperados para aquela construção sintática estão corretos e
presentes.

c.
A verificação semântica das construções do código analisa aspectos que estão além
da sintaxe, como por exemplo, a compatibilidade entre tipos e a declaração prévia
de variáveis.

d.
Embora não obrigatório pelo modelo, a etapa de síntese pode ser decomposta em três
subfases. a geração de código intermediário, em que se produz uma versão do
algoritmo utilizando instruções de três endereços; a otimização, em que se procurar
eliminar redundâncias e melhorar o produto anterior; e por fim, a geração de código
final, em que o algoritmo é efetivamente escrito em linguagem alvo.

e.
A fase de link edição, ou ligação, é responsável por criar o arquivo executável
combinando todos os arquivos objetos em um único módulo de carga.

0,5 pontos

PERGUNTA 9
Analisadores sintáticos do tipo LL(k) realizam a verificação da sentença de modo
descendente, entretanto tem como restrição poderem ser aplicados apenas aos casos
em que a gramática da linguagem é LL(k). Considerando a produção S → S x K | K
qual, dentre as alternativas a seguir, poderia substituí-la de modo a eliminar a
recursão a esquerda e criar uma gramática equivalente? (Considere ε representando a
sentença vazia).
a.
b.
c.
d.
e.
0,5 pontos

PERGUNTA 10

Uma das tarefas primordiais ao processo de compilação é que durante a verificação


da sintática do programa o compilador reporte ao programador todos os erros
detectados para que ele os corrija. Neste contexto, a adoção de uma estratégia que
permita o tratamento e eventual recuperação diante de erros é parte das decisões
que envolvem a construção dos analisadores. Assinale a alternativa que não descreve
de maneira apropriada essas estratégias.

a.
O Modo Pânico é aquele em que o compilador exibe as mensagens de erro e interrompe
qualquer outra atividade do sistema operacional, evitando problemas de gravação dos
dados no disco e a corrupção dos dados armazenados.

b.
A estratégia chamada Recuperação de Frases consiste em rentar recuperar-se do erro
detectado corrigindo localmente o restante da sentença por algum elemento que
permita que a análise prossiga, por exemplo, eliminando os tokens da construção
inválida até que se encontre um ponto e vírgula (que sinalizaria o fim daquele
comando).

c.
O uso das chamadas Produções de Erros consiste na inclusão de novas regras de
produção na gramática da linguagem de modo a acomodando as situações de erro mais
comuns e, com isso, permitir que se conduza ao tratamento mais adequado para erros
daquela natureza.

d.
A chamada Correção Global tem por objetivo escolher ações que permitam corrigir o
código globalmente, escolhendo dentre a situações possível a solução que apresente
a menor sequência de alterações ao programa.

e.
O uso de métodos muito complexos pode não se justificar por consumirem muito tempo
em relação ao resultado que oferecem. Vale lembrar que cabe ao programador corrigir
o código e não ao compilador. Além disto, em grande parte dos casos, os vários
erros envolvem um único token como, por exemplo, na falta de declaração de uma
variável que torna todas as suas ocorrências dentro do código desconhecidas.

Você também pode gostar