Prévia do material em texto
COMPILADORES
Prof. MSc. Renan Costa Alencar
LISTA DE EXERCÍCIOS – REVISÃO – UNDIADE I
1. Sobre as linguagens de programação, é correto afirmar:
a. Linguagens de alto nível cumprem tarefas mais substanciais com um número menor de comandos, mas
exigem programas tradutores denominados compiladores para converter programas em linguagem de alto
nível para linguagem de máquina.
b. Um computador pode entender qualquer linguagem de máquina, pois a linguagem de máquina não é definida
pelo projeto de hardware do computador.
c. Programadores podem escrever instruções em várias linguagens de programação e todas são entendidas
diretamente pelos computadores sem a necessidade de tradução.
d. Softwares escritos em linguagens de máquina são portáveis.
e. Interpretadores são programas que convertem códigos escritos em linguagem de alto nível para programa
sem linguagem de máquina.
2. Conhecer as metodologias utilizadas por um compilador para a análise e síntese de um programa de computador
pode ser muito útil para entender como um software funciona por dentro. Assim, atividades como a engenharia
reversa podem ser mais facilmente entendidas e realizadas.
A esse respeito, no que se refere aos programas de computadores e às fases de um compilador, assinale a
alternativa correta.
a. As fases de análise sintática e semântica tratam da grande maioria dos erros detectáveis pelo compilador.
b. A fase de análise constrói o programa alvo desejado, com base nas respectivas representações intermediárias.
É a fase que requer as técnicas mais especializadas.
c. Durante a análise sintática do programa fonte, o compilador procura encontrar as construções que possuam
a estrutura sintática correta, sem se preocupar com o significado da operação envolvida.
d. A análise semântica, também chamada de análise gramatical, envolve o agrupamento dos tokens do programa
fonte, no qual cada token representa uma sequência de caracteres logicamente coesa, em frases gramaticais
que são usadas pelo compilador, a fim de sintetizar a saída.
e. A fase final do compilador é a geração de código intermediário, na qual as alocações de memória são realizadas
para cada uma das variáveis utilizadas pelo programa.
3. Para que os programas funcionem, eles devem ser traduzidos para o código de máquina (de código fonte para
código objeto) e para isso é necessário um tradutor ou um compilador.
Em relação à característica de um programa compilado, analise as afirmativas a seguir:
I. O compilador ocupa a memória enquanto se executa o programa.
II. O compilador é carregado na memória apenas na compilação do programa.
III. O programa é traduzido inteiramente uma vez.
IV. O programa precisa ser traduzido cada vez que é rodado.
V. Sua execução é rápida.
VI. O programa acaba por se tornar mais lento.
Está CORRETO o que se afirmar em:
a. Somente I.
b. Somente I e VI.
c. Somente IV e VI.
d. II, III e V.
e. I, II, III e V.
4. Os compiladores e interpretadores são exemplos de:
a. softwares aplicativos.
b. softwares utilitários.
c. firmwares.
d. softwares básicos.
e. softwares livres.
5. Durante a compilação de um código-fonte, a fase do compilador que é responsável por produzir uma sequência
de tokens é a:
a. análise léxica.
b. análise semântica.
c. análise sintática.
d. geração de código executável.
e. verificação de tipos.
6. Um compilador é um programa que executa vários passos, dentre os quais, o de analisar uma sequência de entrada
para determinar sua estrutura gramatical segundo uma determinada gramática formal.
O resultado típico dessa análise é uma estrutura conhecida como:
a. árvore AVL
b. árvore sintática
c. fluxo (stream) de tokens
d. gramática dirigida a sintaxe
e. gramática livre de contexto
7. Na implementação de compiladores, a fase de parser do programa baseia-se, em parte, no resultado de um
analisador léxico.
Assinale a opção que descreve o papel de um analisador léxico.
a. Representar as regras da gramática da linguagem.
b. Verificar a conformidade do código fonte com as regras da gramática da linguagem.
c. Definir a notação em que as regras da gramática são expressas.
d. Identificar os tokens gramaticais no código fonte.
e. Exprimir a semântica das construções da linguagem.
8. Abaixo, estão enumeradas as fases que integram o front-end de um compilador:
1. Análise Semântica
2. Análise Léxica
3. Análise Sintática
4. Gerador de código intermediário
Marque a alternativa que mostra a sequência correta das camadas:
a. 1, 3, 2 e 4.
b. 3, 1, 4 e 2.
c. 2, 3, 1 e 4.
d. 1, 4, 2 e 3.
e. 4, 1, 2 e 3.
9. A compilação é o processo de tradução de um programa escrito em uma linguagem fonte em um programa
equivalente em linguagem de máquina. Nesse processo, o programa fonte normalmente passa pelas fases:
I. Identificação de sequências de caracteres de entrada e produção de uma sequência de elementos de saída,
os tokens. Nesta fase, verifica-se se cada caractere do programa fonte pertence ao alfabeto da linguagem,
identificando os tokens e desprezando comentários e espaços em branco. Os tokens constituem classes de
símbolos, tais como palavras reservadas, delimitadores, identificadores etc.
II. Identificação de sequências de símbolos que constituem estruturas como expressões e comandos, através de
uma varredura, ou parsing, da representação interna do programa fonte, produzindo uma estrutura em
árvore, chamada árvore de derivação.
III. Verificação das estruturas quanto ao sentido, ou seja, se o programa não possui erros de significado. Por
exemplo, verifica se um identificador declarado como variável é utilizado como tal, se existe compatibilidade
entre operandos e operadores em expressões etc.
Os itens I, II e III referem-se, correta e respectivamente, às fases
a. Análise Léxica − Análise Sintática − Análise Semântica.
b. Interpretação − Análise Sintática − Montagem.
c. Busca Binária − Montagem Léxica − Análise Semântica.
d. Classificação − Análise Léxica − Montagem.
e. Identificação Inicial − Análise Estrutural − Geração de Código.
10. Podemos afirmar sobre a gramática abaixo que:
Program : Statement ";" Program | /* producao vazia */ ;
Statement : "if" Expression "then" Statement "else" Statement | identifier "=" Expression ;
Expression : identifier | number | identifier "+" Expression | number "+" Expression ;
a. Ela não é ambígua.
b. Ela é ambígua devido à produção Program.
c. Ela é ambígua devido à produção Statement.
d. Ela é ambígua devido à produção Expression.
e. Ela possui produções com recursão à esquerda.
11. Qual a descrição da linguagem denotada pela expressão regular apresentada abaixo?
𝑎(𝑎|𝑏) ∗ 𝑎
a. String de b’s.
b. String de a’s e b’s que começa com a e termina com a.
c. String de a’s entre b’s.
d. String de a’s e b’s com vazio.
e. String de a’s seguido de vazio terminando com b’s.
12. Qual das alternativas de expressão regular representa a linguagem a seguinte: “Cadeia de a’s e b’s que contém
apenas três b.”
a. a(a|b)*a
b. ((ε|a)b*)*
c. (a|b)*a(a|b)(a|b)
d. a*ba*ba*ba*
e. (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*
13. A gramática abaixo define expressões aritméticas simples.
Defina quais os símbolos terminais, não terminais e de início da gramática?
a. Terminais “ + - * / ( ) ”, Não Terminais (expression, term, factor) e Inicial (expression).
b. Terminais “ id + - * / ( ) ”, Não Terminais (expression, term, factor) e Inicial (factor)
c. Terminais “ id + -* / ( ) ”, Não Terminais (expression, term, factor) e Inicial (expression)
d. Terminais “ id + - * / ( ) ”, Não Terminais (expression, term, factor) e Inicial (term)
e. Terminais “ + - * / ”, Não Terminais (expression, term, factor) e Inicial (expression)
14. Uma árvore de derivação é uma representação gráfica de uma derivação que filtra a ordem na qual as produções
são aplicadas para substituir não-terminais. Cada nó interior de uma árvore de derivação representa a aplicação
de uma produção.
O nó interior é rotulado com o não-terminal A do lado esquerdo da produção; os filhos do nó são rotulados, da
esquerda para a direita, pelos símbolos do corpo da produção pelo qual esse A foi substituído durante a
derivação.
A árvore de derivação abaixo foi gerada por qual produção (cadeia)?
a. - ( ) + id id
b. - ( id + id )
c. - ( + ) id id
d. - ( + id id )
e. - ( + id ) id
15. A notação tradicional para expressões aritméticas, que representa uma operação binária na forma x + y, ou seja,
com o operador entre seus dois operandos, é conhecida como notação infixada.
Uma notação alternativa para esse tipo de expressão é a notação pré-fixada, na qual o operador é expresso
antes de seus operandos, como por exemplo, + x y.
Outra notação alternativa é a notação pós-fixada, na qual o operador é expresso após seus operandos, como por
exemplo, x y +.
O atrativo das notações pré-fixada e pós-fixada é que elas dispensam o uso de parênteses ao adotar a noção de
pilha para a representação das expressões. Analise as assertivas a seguir, considerando a gramática livre de
contexto G2.
𝐺2 = ({𝐴, 𝐸, 𝑇, 𝐹, 𝑉}, {𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑥, =, +, −,∗,/, (, )}, 𝑃2, 𝐴)
𝑃2 = {𝐴 → 𝑉 = 𝐸
𝐸 → 𝐸 + 𝑇 | 𝐸 − 𝑇 | 𝑇
𝑇 → 𝑇 ∗ 𝐹 | 𝑇/𝐹 | 𝐹
𝐹 → (𝐸) | 𝑉
𝑉 → 𝑎 | 𝑏 | 𝑐 | 𝑑 | 𝑒 | 𝑓 | 𝑥}
I. A notação pré-fixada da expressão aritmética x = a * b + c * d - e * f é = x + * a b - * c d * e f
II. A notação pré-fixada da expressão aritmética x = a * b + c * d - e * f é = x - + * a b * c d * e f
III. A notação pós-fixada da expressão aritmética x = a - (b - a * (c + b / d)) é x a b a c b d - - * + / =
IV. A notação pós-fixada da expressão aritmética x = a - (b - a * (c + b / d)) é x a b a c b d / + * - - =
Quais das assertivas apresentadas estão corretas?
b. apenas as assertivas I e II.
c. apenas as assertivas I e III.
d. apenas as assertivas II e III.
e. apenas as assertivas II e IV.
f. apenas as assertivas III e IV.
16. Com relação aos conceitos e características de compiladores, julgue os itens que se seguem.
Considere a gramática string → string + string → string – string |0|1|2|3|4|5|6|7|8|9 e a string como um único nó
não terminal, que pode ser um dígito ou uma sentença. Nessa situação, a expressão 10 – 4 + 3 possibilita criar duas
árvores de derivação distintas.
a. Certo
b. Errado
17. Considerando a Gramática Livre de Contexto:
𝐺 = (𝑉, 𝑇, 𝑃, 𝑆), 𝑜𝑛𝑑𝑒:
𝑉 = {𝑆}
𝑇 = {𝑎, 𝑏}
𝑃 = {𝑆 −> 𝑆𝑆 | 𝑎𝑆𝑎 | 𝑏𝑆𝑏 | 𝐸}
I. aa é derivado corretamente a partir da gramática.
II. aabb é derivado corretamente a partir da gramática.
III. aabbaaaa é derivado corretamente a partir da gramática.
IV. ababaab é derivado corretamente a partir da gramática.
V. aaaab é derivado corretamente a partir da gramática.
Assinale a alternativa em que todas as afirmativas estão CORRETAS:
a. I, II, III, IV e V.
b. Apenas II, III e IV.
c. Apenas I, IIe V.
d. Apenas I, II, III.
e. Apenas II e III.
18. Considere a gramática G definida pelo conjunto de símbolos não terminais {S, A, B, C, D}, pelos símbolos
terminais {a,b,c,d}, e pelas regras de produção:
S → AB | BC
A→ Aa | b
B→ C | cC | b
C→ SaAD | BcCS
D → dS | Ad
A palavra "caabc" pertence à linguagem gerada por esta gramática?
a. Certo
b. Errado
19.