Prévia do material em texto
O que faz a análise léxica?
Lê caractere por caractere do texto encontrando sequências que
constituem tokens;
Verifica se as estruturas do programa irão fazer sentido 4 durante
a execução;
Verifica se a estrutura gramatical do programa está correta;
Tratar erros de tipo no programa fonte;
É um sistema que aceita como entrada um programa escrito em
uma linguagem de programação e produz como resultado um
programa equivalente em outra linguagem;
Considere os seguintes passos da compilação:
I. Otimização
II. Análise Léxica
III. Geração de Código
IV. Geração de Código Intermediário
V. Análise Semântica
VI. Análise Sintática
A ordem correta dos passos durante a compilação é:
III, V, VI, IV, I e II
II, V, VI, IV, I e III
II, VI, V, IV, I e III
III, IV, VI, V, I e II
III, IV, V, VI, I e II
Os Meta-caracteres são caracteres especiais na especificação de
Expressões Regulares, que aumentam muito sua expressividade. Eles
podem ser quantificadores, definidores de classes de caracteres,
definidores de lista etc....
O Meta-caracter que corresponde a seguinte classe [A-Za-z0-9] é o
A ordem correta dos passos durante a compilação é:
\d
\c
\w
\W
\C
O GALS é um gerador de analisadores léxicos que a partir de
expressões regulares cria um autômato finito determinístico que as
analisa.
Para que possa funcionar ele deve ter os seus tokens especificados.
Como seria a especificação do token no GALS para
identificadores (Id) formados pela primeira letra maiúscula sendo
seguido de pelo menos uma ou mais letras minúsculas deverá existir
pelo menos um letra?
Id:[A-Z] [a-z]+.
Id: [A-Za-z]+
Id:[A-Z]*
Id:[A-Z] [a-z]*.
Id:[a-z]+
Considere a seguinte gramática
S → XYZ
X → aXb | ε
Y → cYZcX | d
Z → eZYe | f
Levando-se em conta a necessidade de criar a tabela sintática, seriam gerados os
conjuntos First e Follow de cada um dos não terminais.
Qual seria o conjunto First de S?
{a, c, d, e}
{ a, d}
{a, c, e}
{a, c, d}
{c, d, e}
ANO: 2010 BANCA: CESPE ÓRGÃO: INMETRO PROVA: PESQUISADOR - CIÊNCIAS DA
COMPUTAÇÃO
Considere que, em uma linguagem de programação hipotética, um comando condicional
IF exija o uso de THEN, representando a cláusula então. Nesse caso, se a instrução
THEN não for usada no código fonte, uma resposta do compilador na identificação do
erro de programação estará
no nível sintático
no nível lógico
nos níveis sintático e semântico, ao mesmo tempo
no nível semântico
no nível léxico
As árvores de sintaxe são a forma mais comum de representação intermediária gráfica.
Dentre estas árvores temos as de Derivação, Sintática e Derivação Anotada.
Com relação a estas árvores avalie as afirmativas abaixo:
I. Decorar uma árvore é o ato de, durante a fase de parser, realizar a associação dos
símbolos aos seus atributos na árvore de derivação.
II. A Árvore Sintática é obtida eliminando-se os nós referentes aos símbolos não
terminais na árvore de derivação.
III. A árvore de Derivação possui em suas folhas apenas símbolos não terminais.
Podemos afirmar que está correto o que se afirma apenas em:
II
I e III
II e III
I e II
III
Apesar de ser considerada o terceiro passo da etapa de análise, a Análise Semântica é
normalmente realizada de forma concomitante com a Análise Sintática, sendo que o
parser vai executar as ações semânticas estabelecidas para as produções da
gramática.
A respeito da situação descrita podemos afirmar que:
I. Quando um esquema de tradução não produz efeitos colaterais ele é chamado de
Gramática de Atributos.
II. O Esquema de Tradução corresponde a uma restrição aplicada a Gramática Livre de
Contexto (GLC) que define a linguagem de programação.
III. A Tradução Dirigida por Sintaxe é a técnica que permite realizar a Análise
Semântica de forma concomitante com a análise sintática.
É correto o que se afirma apenas em:
I
I e III
I e II
III
II e III
Apesar de ser considerada o terceiro passo da etapa de análise, a Análise Semântica é
normalmente realizada de forma concomitante com a Análise Sintática, sendo que o
parser vai executar as ações semânticas estabelecidas para as produções da
gramática.
A respeito da situação descrita podemos afirmar que:
I. Quando um esquema de tradução não produz efeitos colaterais ele é chamado de
Gramática de Atributos.
II. O Esquema de Tradução corresponde a uma restrição aplicada a Gramática Livre de
Contexto (GLC) que define a linguagem de programação.
III. A Tradução Dirigida por Sintaxe é a técnica que permite realizar a Análise
Semântica de forma concomitante com a análise sintática.
É correto o que se afirma apenas em:
I
I e III
I e II
III
II e III
Existem varios tipos de representações intermediárias tanto graficas como textuais.
Durante a fase de síntese a Geração de Código Intermediário irá transformar o
resultado da fase de análise em uma outra representação.
Uma das formas de representação intermediária é a notação posfixa.
Considerando a seguinte expressão em notação infixa (a+b)*(c+d)
qual seria a notação posfixa correspondente?
a b * + c d +
a b + * c d +
a b + c d * +
a b + c d + *
a b * c d + +
O tradutor que gera um código objeto a partir de uma linguagem de
baixo nível é o :
Montador
Compilador
Ligador
Carregador
Interpretador
Considere os seguintes passos da compilação:
I. Otimização
II. Análise Léxica
III. Geração de Código
IV. Geração de Código Intermediário
V. Análise Semântica
VI. Análise Sintática
A ordem correta dos passos durante a compilação é:
III, V, VI, IV, I e II
II, V, VI, IV, I e III
III, IV, VI, V, I e II
III, IV, V, VI, I e II
II, VI, V, IV, I e III
Os Meta-caracteres são caracteres especiais na especificação de
Expressões Regulares, que aumentam muito sua expressividade. Eles
podem ser quantificadores, definidores de classes de caracteres,
definidores de lista etc....
O Meta-caracter que corresponde a seguinte classe [A-Za-z0-9] é o
A ordem correta dos passos durante a compilação é:
\d
\C
\W
\c
\w
O GALS é um gerador de analisadores léxicos que a partir de
expressões regulares cria um autômato finito determinístico que as
analisa.
Para que possa funcionar ele deve ter os seus tokens especificados.
Como seria a especificação do token no GALS para
identificadores (Id) formados pela primeira letra maiúscula sendo
seguido de pelo menos uma ou mais letras minúsculas deverá existir
pelo menos um letra?
Id:[A-Z]*
Id: [A-Za-z]+
Id:[A-Z] [a-z]*.
Id:[A-Z] [a-z]+.
Id:[a-z]+
Considere a seguinte gramática
S → XYZ
X → aXb | ε
Y → cYZcX | d
Z → eZYe | f
Levando-se em conta a necessidade de criar a tabela sintática, seriam gerados os
conjuntos First e Follow de cada um dos não terminais.
Qual seria o conjunto First de S?
{c, d, e}
{a, c, d}
{a, c, d, e}
{ a, d}
{a, c, e}
ANO: 2010 BANCA: CESPE ÓRGÃO: INMETRO PROVA: PESQUISADOR - CIÊNCIAS DA
COMPUTAÇÃO
Considere que, em uma linguagem de programação hipotética, um comando condicional
IF exija o uso de THEN, representando a cláusula então. Nesse caso, se a instrução
THEN não for usada no código fonte, uma resposta do compilador na identificação do
erro de programação estará
no nível semântico
no nível léxico
no nível lógico
no nível sintático
nos níveis sintático e semântico, ao mesmo tempo
As árvores de sintaxe são a forma mais comum de representação intermediária gráfica.
Dentre estas árvores temos as de Derivação, Sintática e Derivação Anotada.
Com relação a estas árvores avalie as afirmativas abaixo:
I. Decorar uma árvore é o ato de,durante a fase de parser, realizar a associação dos
símbolos aos seus atributos na árvore de derivação.
II. A Árvore Sintática é obtida eliminando-se os nós referentes aos símbolos não
terminais na árvore de derivação.
III. A árvore de Derivação possui em suas folhas apenas símbolos não terminais.
Podemos afirmar que está correto o que se afirma apenas em:
I e III
II e III
I e II
II
III
Verificação de tipos é uma atividade extremamente importante na análise semântica já
que determinados erros somente são percebidos nesta atividade, pois passam
despercebidos nas Análises Léxicas e Sintáticas.
Considere o seguinte trecho de programa :
inteiro a,b,c;
{
....
c:= a + b;
....
}
Quanto a expressão c:= a + b; podemos afirmar que:
O seu tipo será inteiro
porque
todos os operandos são do tipo inteiro
Com base nas afirmativas podemos concluir que:
As duas são corretas e a segunda não justifica a primeira
As duas afirmativas são falsas
A primeira é falsa e a segunda correta
As duas são corretas e a segunda justifica a primeira
A primeira é verdadeira e a segunda falsa
Procedimentos são rotinas que complementam as funcionalidades de um programa.
Quando um procedimento é chamado um Registro de Ativação é criado e colocado na
pilha.
Neste registro são armazenadas a variáveis locais, o contexto e os parametrosdo
procedimento.
Com base nisso considere a seguinte expressão onde p1 e p2 são funções
x = p1 (a, p2(b));
Sabendo-se que o código abaixo mostra a implementação do trecho em código
intermediário em que ?1, ?2, ?3 e ?4 representam partes faltantes do código .
param a
param b
_t1 := call ?1, ?2
param _t1
x := call ?3, ?4
Quais seriam os valores de ?1, ?2, ?3 e ?4 respectivamente?
p2 - 2 - p1 - 2
p1 - 1 - p2 - 2
p2 - 1 - p1 - 2
p2 - 2 - p1 - 1
p1 - 2 - p2 - 1
Existem varios tipos de representações intermediárias tanto graficas como textuais.
Durante a fase de síntese a Geração de Código Intermediário irá transformar o
resultado da fase de análise em uma outra representação.
Uma das formas de representação intermediária é a notação posfixa.
Considerando a seguinte expressão em notação infixa (a+b)*(c+d)
qual seria a notação posfixa correspondente?
a b * + c d +
a b + c d * +
a b + c d + *
a b * c d + +
a b + * c d +
Autômato Finito é formalmente definido por uma quíntupla como por
exemplo esta:
Q = número de estados = {S0, S1, S2, S3,S4,S5}
ΣΣ = símbolos de entrada = {A,E,M,O,S}
δδ = transições =
δδ (S0,S) = S1
δδ (S1,E) = S2
δδ (S1,O) = S3
δδ (S3,M)= S4
δδ (S4,A) = S5
q0 = estado inicial = {S0}
F = conjunto de estados finais = {S3,S5}
Sabendo-se que os estados finais quando atingidos caracterizam que a
palavra foi aceita, que palavras seriam aceitas por este autômato?
"Mesa" e "Ema"
"Se" e "Soma"
"Mesa" e "So"
"Som" e "Sema"
"So" e "Sema"
O GALS além dos tokens permite a escrita de definição regulares que
facilitam a construção do tokens.
Observe a figura abaixo:
Ela faz a especificação de um token chamado ID, qual das opções abaixo
apresenta o único lexema que atende a especificação:
3A
A3
A3A
AA3
AA.
Tabela de símbolos implementadas como tabelas hash implicam no uso de uma fórmula,
denominada fórmula de hash que a partir de algum tipo de cálculo define o índice do slot
onde o símbolo será armazenado.
Fórmulas de hashing bem selecionadas produzem um espalhamento dos símbolos por
diferentes slots, com base nisso podemos afirmar que apesar de não
existirem fórmulas perfeitas se eventualmente dois símbolos gerarem o mesmo índice não
ocorrerá uma colisão porque métodos como Endereçamento Aberto e Hashing Aberto
fazem com que os símbolos sejam armazenados em locais diferentes.
Com base nas afirmativas acima podemos concluir que:
A primeira é verdadeira e a segunda falsa
A primeira é falsa e a segunda correta
As duas são corretas e a segunda não justifica a primeira
As duas são corretas e a segunda justifica a primeira
As duas afirmativas são falsas
As representações intermediárias lineares são utilizadas para produzir o resultado da
Análise Semântica.
As respeito destas representações analise as seguintes afirmativas:
I. Código de máquina de pilha é um exemplo de código de um endereço
II. Códigos de um endereço utilizam nomes implícitos
III. Códigos de dois endereços não utilizam operações destrutivas.
IV. Código de três endereços possuem o formato básico r ← x op y
Estão corretas apenas as afirmativas:
I, II e IV
II e III
I e IV
II, III e IV {ε}
I, II e III
Enade 2008
Compiladores de linguagens de programação traduzem programas-fonte, em uma
linguagem de entrada, para programas-objeto, em uma linguagem de saída. Durante o
processo de tradução, o compilador deve verificar se as sentenças do programa-fonte
estão sintaticamente corretas.
Esse processo de análise sintática pode ser realizado construindo-se uma árvore de análise
segundo duas principais abordagens: top-down, quando a árvore é investigada da raiz às
folhas; ou bottom-up, das folhas à raiz.
Acerca desse assunto, julgue os itens seguintes.
I A análise top-down é adequada quando a linguagem de entrada é definida por uma
gramática recursiva à esquerda.
II Independentemente da abordagem adotada, top-down ou bottom-up, o analisador
sintático utiliza informações resultantes da análise léxica.
III Se os programas em uma linguagem podem ser analisados tanto em abordagem top-
down como em bottom-up, a gramática dessa linguagem é ambígua.
IV A análise bottom-up utiliza ações comumente conhecidas como deslocamentos e
reduções sobre as sentenças do programa-fonte.
Estão certos apenas os itens
I e II
II e IV
II, III e IV
I, III e IV
I e III
Considere a seguinte gramática:
E → +EE
E → *EE
E → a
E → b
Podemos afirmar que ela somente pode ser analisada por um Parser Descendente Preditivo
Porque
Ela está fatorada e sem recursão à Esquerda
Como base nas afirmativas acima podemos concluir que:
As duas afirmativas são falsas
A primeira é verdadeira e a segunda falsa
As duas são corretas e a segunda não justifica a primeira
As duas são corretas e a segunda justifica a primeira
A primeira é falsa e a segunda correta
A alocação de registradores junto com a seleção de instruções são atividades fundamentais na
geração do código de montagem. Ela possui um impacto enorme no desempenho do programa já
que ao se utilizar os registradores para minimizar o acesso a memória torna a execução mais
eficiente.
Considerando que temos uma máquina com dois registradores (r0 e r1) e com o conjunto de
instruções do quadro abaixo
Sub r0 bMove r0 a
Move r1 c
Add r1 r0
Move x r1
Move r1 d
Mult r1 e
Add r0 f
Move y r1
Add x r1
Move x r1
Move z r0
Move w r1
Podemos afirmar que:
A instrução Move y r1 foi necessária para derramar o conteúdo de r1 em Y
Porque
Era necessário liberar o um registrador para poder continuar a execução do programa da forma
mais eficiente.
Com base nas afirmativas acima podemos concluir que:
As duas afirmativas são falsas
As duas são corretas e a segunda não justifica a primeira
A primeira é verdadeira e a segunda falsa
As duas são corretas e a segunda justifica a primeira
A primeira é falsa e a segunda correta
Computadores modernos fazem amplo uso do multiprocessamento , pois possuem vários
núcleos o que permite a execução em paralelo de várias instruções de um mesmo
programa.
Este recurso pode ser utilizado na otimização do código para partir da diminuição da altura
da árvore sintática ea alocação das operações nos vários núcleos.
Dentro desta concepção analise a Árvore Sintática abaixo que se originou de outra árvore
de altura maior
Com base na análise podemos afirmar que:
Está árvore é uma tentativa de utilizar o multiprocessamento para a sequência de
operações
Porém
A otimização não irá funcionar já que ela possui operadores diferentes em seus nós
internos
Com base nas afirmativas acima podemos concluir que:
As duas são corretas e a segunda justifica a primeira
As duas afirmativas são falsas
A primeira é falsa e a segunda correta
A primeira é verdadeira e a segunda falsa
As duas são corretas e a segunda não justifica a primeira
(EMPREL/2019 - Adaptada) Qual é o componente de um compilador que lê um fluxo de
entrada (caracteres) e produz um fluxo de saída que contém palavras das quais cada uma
é rotulada com sua categoria sintática, equivalente a uma classe gramatical da palavra na
linguagem do programa fonte?
Analisador Léxico.
Analisador Semântico.
Otimizador.
Analisador Sintático.
Gerador de Código Intermediário.
Os compiladores, de um modo geral, são compostos de funções
padronizadas, as quais compreendem a análise do programa fonte e
então a síntese para a derivação do código objeto.
O processo de compilação é comumente estruturado em passos que, eles
são:
análise da gramática, busca binária, geração de código
intermediário, geração de objeto final.
reconhecimento dos tokens iniciais e finais, análise contextual,
aplicação de algoritmo de escalonamento, geração de código
intermediário e geração de código objeto.
análise léxica, análise sintática, análise semântica, síntese do
programa fonte e reutilização de tokens.
análise léxica, análise sintática, análise semântica, geração de
código intermediário, otimização de código e geração de código.
simplificação do programa fonte, aplicação de algoritmo de
escalonamento, análise contextual, geração e otimização de
código.