Compiladores
Semana 1 2
Considere o processo de compilação de um programa e analise as afirmações para, em seguida, assinalar a alternativa correta.
I. A execução do programa faz parte do processo de compilação.
II. A execução do programa é uma etapa separada após a compilação
III. Na análise léxica, os caracteres são lidos e, depois, agrupados em conjuntos que são relevantes para outros componentes do compilador.
IV. Na análise semântica, são analisados erros sintáticos de um programa.
Considere as alternativas a seguir e escolha apenas aquela que define o que é um "analisador léxico" em um compilador.
Semana 2 2
Considere o seguinte trecho de código em uma linguagem de programação fictícia:
int x = 42
Qual é o token gerado pelo analisador léxico para a palavra-chave "int"?
Analise o seguinte trecho de código em uma linguagem de programação fictícia e responda corretamente à pergunta:
if (x > 5) {
y = 10;
} else {
y = 20;
}
Qual é otoken gerado pelo analisador léxico para o operador "else"?
Semana 3 2
Dado o seguinte trecho de código em uma linguagem de programação:
if (x > 5) {
y = 10;
}
Qual regra gramatical representa a estrutura condicional "if" no código acima?
Considere a seguinte gramática para expressões matemáticas simples:
<expr> ::= <term> + <expr> | <term> - <expr> | <term>
<term> ::= <factor> * <term> | <factor> / <term> | <factor>
<factor> ::= <number> | (<expr>)
<number> ::= [0-9]+
Qual das seguintes expressões é sintaticamente válida de acordo com essa gramática?
Semana 4 5
Analise a seguinte gramática LR(1):
1. S -> E
2. E -> E + T
3. E -> T
4. T -> T * F
5. T -> F
6. F -> ( E )
7. F -> id
Considere a entrada id + id * id. Qual é a ação que o analisador LR(1) deve tomar quando chegar ao ponto onde id * id foi reconhecido?
Dado o seguinte trecho de código na linguagem de programação Python:
if (x > 0) then
y = x + 1;
else
y = x – 1;
Suponha que você está construindo um analisador sintático descendente LL(1) para essa linguagem. Qual é o próximo passo de análise após reconhecer a produção if (x > 0) then?
Considere uma gramática livre de contexto para uma linguagem de programação. Você está construindo um analisador sintático descendente LL(1) para essa gramática. Qual das seguintes afirmações é verdadeira sobre a análise LL(1)?
Suponha que você está construindo um analisador sintático descendente LL(1) para uma linguagem de programação. Quando ocorre um conflito de parsing na tabela LL(1), qual ação é tomada?
Dado o seguinte trecho de código em uma linguagem de programação:
int main() {
int x = 5;
x = x + 1;
return x;
}
Suponha que você está construindo um analisador sintático ascendente LR(1) para essa linguagem. Qual é o próximo passo de análise após reconhecer o seguinte símbolo: int x = 5;?
Semana 5 5
A você foi dada a incumbência de escrever um compilador para uma linguagem de programação que permite a declaração de variáveis com o mesmo nome em diferentes escopos. Sobre essa situação, avalie as seguintes assertivas:
I. Nesse caso, a tabela de símbolos pode conter várias entradas com o mesmo nome, mas em diferentes escopos.
II.
Quando uma variável é referenciada em um programa, o compilador deve
usar a regra de "escopo mais próximo" para determinar qual variável com o
mesmo nome é acessada.
III.
A ordem de declaração das variáveis não afeta o resultado, já que o
compilador usa apenas o escopo mais próximo para determinar a variável a
ser acessada.
IV.
Em linguagens que permitem sombreamento de variáveis (variáveis com o
mesmo nome em escopos diferentes), a tabela de símbolos deve manter
informações sobre os escopos em que cada variável foi declarada.
V.
O uso de variáveis com o mesmo nome em diferentes escopos pode causar
ambiguidades e erros semânticos, e o compilador deve tratá-los
adequadamente.
Assinale a alternativa com a ordem correta:
Analise as alternativas a seguir e assinale qual delas indica a principal função da análise semântica em um compilador:
Considere o trecho de código de uma linguagem de programação a seguir:
x = 10
y = "20"
z = x + y
Sobre a análise semântica desse código, avalie as seguintes assertivas e classifique-as em verdadeiras (V) ou falsas (F):
I. Não há erros de tipo no código, pois a linguagem permite operações entre inteiros e strings.
II. A variável z terá o valor "1020" após a execução do código.
III. O código possui um erro de tipo, pois não é permitida a operação de adição entre um inteiro e uma string.
IV. A variável yé usada antes de ser inicializada, o que resulta em um erro semântico.
V. A atribuição z = x + yé uma operação válida e não gera erros semânticos.
Assinale a alternativa com a ordem correta:
Considere que você está escrevendo um compilador para uma linguagem de programação. Durante a análise semântica, qual é uma das principais tarefas relacionadas à verificação de tipos?
Sobre a tabela de símbolos no processo de estruturação de um compilador, avalie as seguintes assertivas e classifique-as em verdadeiras (V) ou falsas (F):
(I)
A tabela de símbolos é uma estrutura de dados que armazena informações
sobre variáveis, funções e outros identificadores em um programa.
(II)
Cada entrada na tabela de símbolos geralmente contém informações como o
nome do identificador, seu tipo, seu escopo e seu endereço de memória
(caso aplicável).
(III) A tabela de símbolos é usada apenas durante a análise sintática para verificar a corretude sintática do código-fonte.
(IV)
Em linguagens de programação, o escopo de um identificador pode afetar
sua visibilidade e acessibilidade em diferentes partes do código.
(V) Uma tabela de símbolos bem implementada deve garantir que não haja conflitos de nome entre diferentes identificadores.
Assinale a alternativa com a ordem correta:
Semana 6 2
Considere o seguinte trecho de código em uma linguagem de programação de alto nível:
x = 10
y = 20
z = x + y
Suponha que estamos gerando código intermediário para essa parte do programa. Qual das seguintes opções representa corretamente o código intermediário para a operação de adição?
Ao gerar código intermediário para uma expressão aritmética em um compilador, qual das seguintes alternativas apresenta uma técnica comum para lidar com a ordem das operações?
Semana 7 2
Considere o seguinte código:
1. x = 5
2. y = 3
3. z = x + y
4. w = z - 2
5. resultado = w * 4
Considere que um desenvolvedor deseja aplicar a técnica “Reordenação de Instruções" para otimizar esse código intermediário. Qual seria a ordem das instruções após a otimização?
Ao lidar com o desenvolvimento de um compilador, o programador quer aplicar a otimização “Eliminação de Código Morto” em um código intermediário. Qual é o principal objetivo dessa otimização e como o programador aplicaria a técnica ao código intermediário abaixo?
1. x = 5
2. y = x + 3
3. z = 2 * y
4. w = z - 5
5. v = z * 2