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.