Buscar

QUESTIONÁRIO UNIDADE 01

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

PERGUNTA 1
1. Durante o processo de verificação da estrutura sintática de um programa, o analisador simula o processo de construção da árvore de derivação para o programa que está sendo compilado. Usualmente esse processo é realizado adotando-se uma dentre duas abordagens possíveis. a top-down, em que se parte do símbolo inicial da gramática e tenta-se alcançar os elementos que compõe o programa; e a botton-up, que segue o princípio contrário, partindo do código e realizado reduções na sentença até que se alcance o símbolo inicial que caracterize o elemento raiz da árvore. A respeito destas estratégias assinale a alternativa correta.
	
	a.
	Os métodos descendentes são usualmente mais convenientes em casos de implementação manual, enquanto os métodos ascendentes (botton-up) são considerados mais favoráveis para construtores automáticos de analisadores.
	
	b.
	Dada uma gramática G qualquer, sempre é possível obter tanto um analisador ascendente quanto descendente para ela. Assim, a escolha de qual abordagem será empregada no projeto é meramente uma questão de escolha ou preferência.
	
	c.
	O tempo de compilação de um programa independe do método utilizado em seu analisador. Isso se justifica pelo fato de que, se considerarmos o mesmo código, os aspectos sintáticos do programa em ambas abordagens são iguais (mesma árvore de derivação) e, portanto, serão verificados através das mesmas operações (expansões dos não-terminais e verificações dos terminais).
	
	d.
	Dentre os métodos top-down, a Análise Descente Recursiva é considerado o mais eficiente e que oferece melhor desempenho na verificação do código. Em meio aos métodos botton-up, o método LL(k) é o exemplo mais comum, pois a maioria das ferramentas automáticas geram analisadores deste tipo.
	
	e.
	O método descendente LR(1) é o mais eficiente em termos de tempo médio de análise, garantindo bom desempenho mesmo para programas bastante complexos em termos sintáticos. Por este motivo os métodos LR são os mais utilizados em projetos de compiladores comerciais.
0,5 pontos   
PERGUNTA 2
1.  
A gramática dada a seguir é LL(1). Nela os elementos +, *, (, ) e id configuram como símbolos terminais, enquanto os E, T, F, E’ e T’ são considerados não-terminais. A tabela de movimentos M fornece ao reconhecedor o número da regra que deve ser aplicada durante a análise da sentença, sendo necessário apenas conhecer o não-terminal a ser derivado e o primeiro símbolo presente no restante da entrada.
Sobre a construção de analisadores sintáticos deste tipo é incorreto afirmar que:
	
	a.
	A tabela indica que a regra 1 deve ser aplicada quando um símbolo não-terminal E estiver sendo derivado e na entrada houver algum elemento que pertença ao conjunto First(TE’).
	
	b.
	Por ser uma produção que deriva para vazio, a regra 3 somente será aplicada se o símbolo não-terminal sendo derivado for o E’ e o símbolo corrente na entrada pertencer ao conjunto Follow(E’).
	
	c.
	Células marcadas com “-“ indicam um movimento não previsto e assim, qualquer situação que leve o reconhecedor a uma delas deve ser entendida como um problema sintático da sentença e reportado como um erro.
	
	d.
	A aplicação da regra 8 deve ser feita antes da regra 7, segundo a interpretação que temos da tabela. Esse fato se comprova ao observarmos que o símbolo “(“ poderia ocorrer imediatamente após um “id” segundo o que determina as produções da gramática.
	
	e.
	Regras de produção que apresentam prefixos comuns para o mesmo não-terminal impedem a construção de um analisador deste tipo, pois implicarão em duas ou mais regras válidas (aplicáveis) para a mesma combinação de símbolos. Ou seja, a tabela ficaria com dois ou mais valores em uma mesma célula.
0,5 pontos   
PERGUNTA 3
1. 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 4
1. Durante a varredura do código fonte pelo Scanner (Analisador Léxico) várias tarefas ditas secundárias são realizadas. Assinale a alternativa cuja tarefa não corresponde as atribuições esperadas para um analisador léxico.
	
	a.
	Eliminar caracteres irrelevantes do código fonte, tais como. espaços em branco, quebras de linha, comentários ou quaisquer outros itens de documentação.
	
	b.
	Reconhecer a utilização de operadores e palavras reservadas da linguagem, assim como a de qualquer outro elemento significativo, compondo uma sequência de tokens representativa do código para as etapas subsequentes.
	
	c.
	Validar os identificadores criados pelo programador, pois embora sejam definidos pela linguagem, é possível adotar quaisquer sequências de caracteres desde que obedeçam as regras que definem os chamados identificadores válidos.
	
	d.
	Reconhecer de maneira apropriada o uso dos caracteres numéricos (dígitos), diferenciando seu uso na composição de números inteiros e reais, além de outras situações como na formação de identificadores ou participando de strings.
	
	e.
	Detectar os marcadores de início e de fim de blocos para que os comandos possam ser agrupados em um único elemento e entregues para a fase de análise sintática com um comando único. 
0,5 pontos   
PERGUNTA 5
1. 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 reconhecedordestas 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 6
1. 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 7
1. 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 8
1. 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 9	//essa ta errada pesquisar
1. Supondo a gramática a seguir e a sentença (a,(a),(a,a)), quais seriam os movimentos realizados por um reconhecedor ascendente para esta cadeia?
G = ({L,S}, {“(“, ”)”, ”a”, ”,”}, L, P )
P. L → (S)
S → I,S | I
I → a | L
	
	a.
	(a,(a),(a,a)) ⇒ (I,(a),(a,a)) ⇒ (I,(I),(a,a)) ⇒ (I,(S),(a,a)) ⇒ (I,L,(a,a)) ⇒ (I,I,(a,a)) ⇒ (I,I,(I,a)) ⇒(I,I,(I,I)) ⇒ (I,I,(I,S)) ⇒ (I,I,(S)) ⇒ (I,I,L) ⇒ (I,I,I) ⇒ (I,I,S) ⇒ (I,S) ⇒ (S) ⇒ L.
	
	b.
	(a,(a),(a,a)) ⇒ (I,(a),(a,a)) ⇒ (I,(I),(a,a)) ⇒ (I,(S),(a,a)) ⇒ (I,L,(a,a)) ⇒ (I,I,(a,a)) ⇒ (I,I,(I,a)) ⇒(I,I,(S,a)) ⇒ Erro, cadeia inválida.
	
	c.
	(a,(a),(a,a)) ⇒ (a,(a),(a,I)) ⇒ (a,(a),(I,I)) ⇒ (a,(a),(S)) ⇒ (a,(a),(S)) ⇒ (a,(a),L) ⇒ (a,(a),I) ⇒ (a,(a),S) ⇒ (a,(I),S) ⇒ (a,(S),S) ⇒ (a,L,S) ⇒ (a,I,S) ⇒ (a,S) ⇒ (I,S) ⇒ (S) ⇒ L.
	
	d.
	L ⇒ (S) ⇒ (I,S) ⇒ (a,S) ⇒ (a,I,S) ⇒ (a,L,S) ⇒ (a,(S),S) ⇒ (a,(I),S) ⇒ (a,(a),S) ⇒ (a,(a),I) ⇒ (a,(a),L) ⇒(a,(a),(S)) ⇒ (a,(a),(I,S)) ⇒ (a,(a),(a,S)) ⇒ (a,(a),(a,I)) ⇒ (a,(a),(a,a)).
	
	e.
	L ⇒ (S) ⇒ (I,S) ⇒ (a,S) ⇒ (a,I,S) ⇒ (a,L,S) ⇒ (a,(S),S) ⇒ (a,(I),S) ⇒ (a,(a),S) ⇒ (a,(a),I) ⇒ (a,(a),L) ⇒(a,(a),(S)) ⇒ (a,(a),(I)) ⇒ (a,(a),(a)) ⇒ Erro, cadeia inválida. 
0,5 pontos   
PERGUNTA 10
1. 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çãona 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.

Continue navegando