Baixe o app para aproveitar ainda mais
Prévia do material em texto
E-Book - Apostila Esse arquivo é uma versão estática. Para melhor experiência, acesse esse conteúdo pela mídia interativa. Unidade 1 - Estrutura de um compilador E-Book - Apostila E-Book - Apostila 2 - 32 Introdução da disciplina ESPECIALISTA EM GESTÃO PÚBLICA, GESTÃO BANCÁRIA E NEGÓCIOS. ESPECIALISTA EM MÍDIAS NA EDUCAÇÃO. GRADUADO EM ADMINISTRAÇÃO E EM SISTEMAS PARA INTERNET. Gilberto Aneide Camargo Dutra DOUTOR EM ENGENHARIA BIOMÉDICA COMPUTACIONAL. João Carlos Lopes Fernandes Olá, estudante! Tudo bem? Para darmos início ao nosso conteúdo, assista ao vídeo de apresentação a seguir. Recurso Externo E-Book - Apostila 3 - 32 Recurso é melhor visualizado no formato interativo Agora, vamos dar início à nossa unidade! Introdução da unidade Nesta unidade, falaremos sobre a gramática e as linguagens livres de contexto, bem como suas definições e notações formais. Ademais, estudaremos sobre como representar uma árvore derivativa, responsável por apresentar, de forma gráfica, as derivações de uma linguagem livre de contexto e os resultados. Em um segundo momento, abordaremos as linguagens de programação, responsáveis por permitir o entendimento entre máquina e programador. Aqui, o foco será o estudo relacionado aos compiladores, que são capazes de receber um código-fonte e transformá-lo em programa equivalente, relatando os possíveis erros. Ao final, falaremos sobre a construção de compiladores e de ferramentas compiladoras, que são capazes de gerar sistemas simples, a partir de códigos complexos, oferecendo geração de analisadores e gerenciamento de erros. Vamos lá?! Bons estudos! Gramática livre de contexto Iniciaremos fazendo uma breve revisão sobre gramática livre de contexto e já com uma pergunta. O que é gramática? E-Book - Apostila 4 - 32 Segundo o Dicionário Online de Português (2022), gramática (do grego grammatiké, "arte das letras"; e do latim grammatica, "gramática") é o "[...] conjunto de princípios que regem o funcionamento de uma língua, determinando o uso considerado correto de uma língua", ou seja, refere-se a regras e estabelece o que é "proibido" ou "permitido" ao escrever ou falar em um dado idioma. Noam Chomsky, linguista norte-americano, reverenciado no mundo acadêmico como o "pai da linguística moderna", concebeu uma hierarquia de linguagens (hierarquia de Chomsky), conforme a figura a seguir, composta por linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livre de contexto (objeto do nosso estudo) e linguagens regulares. FIGURA 1 - Hierarquia de Chomsky Fonte: Elaboração do autor, 2022. Nas linguagens formais, a gramática (G) é responsável pelo grupo de regramentos aplicados a elementos (símbolos terminais ou não terminais), permitindo a geração de cadeias (ou strings), que pertencem a uma linguagem (L). Consequentemente, uma gramática G define uma linguagem L, denotando-se da seguinte forma: L(G). Dessa maneira, a gramática formal pode ser definida assim: E-Book - Apostila 5 - 32 G = (V, T, P, S), em que: V: conjunto de variáveis ou símbolos não terminais. T: conjunto de símbolos terminais. P: conjunto de regras de derivação. S: símbolo (variável) não terminal inicial. Nessa definição, as produções de G relacionam as variáveis V entre si e/ou símbolos terminais de T, estabelecendo as regras que nortearão a construção de cadeias de linguagem especificada pela gramática. Buscando facilitar a notação, convenciona-se que: (Clique nas setas para avançar ou retornar o conteúdo) variáveis são denotadas por letras latinas maiúsculas do início do alfabeto (A, B, C, ...); terminais são representadas por letras latinas minúsculas do início do alfabeto, dígitos e símbolos especiais (a, b, c, ..., 0, 1, 2, ..., *, + etc.); formas sentenciais são indicadas por letras gregas minúsculas do início do alfabeto (α, β, γ, ...); cadeias são representadas por letras latinas do fim do alfabeto (w, x, y, z, ...). E-Book - Apostila 6 - 32 A seguir, falaremos sobre derivação e redução. Confira! Derivação e redução A derivação ocorre quando há a substituição do lado esquerdo de uma sequência (ou de parte dos caracteres, strings) de uma gramática pelos símbolos do lado direito. Já a redução é o resultado dessa derivação. Para aprofundar um pouco mais o conhecimento obtido até aqui, assista ao vídeo a seguir, que fala sobre a derivação e a redução, apresentando importantes considerações acerca da temática desta unidade. Recurso Externo Recurso é melhor visualizado no formato interativo A partir do que foi apresentado no vídeo, podemos continuar falando da derivação e da redução. Vamos lá?! Derivação mais à direita e mais à esquerda Seja a derivação S ⇒ α ⇒ β, em que definimos que β é resultado de α, pela substituição de um não terminal de α. Então, constatamos que: uma derivação mais à esquerda é resultado da substituição de um símbolo presente mais à esquerda; uma derivação mais à direita é resultado da substituição de um símbolo presente mais à direita. E-Book - Apostila 7 - 32 Desse modo, entendemos que α é uma derivação à esquerda ou à direita, respectivamente, quando é obtido de uma derivação mais à esquerda ou mais à direita. As derivações da sentença “- ( id + id )” a seguir são exemplos, sendo a primeira mais à esquerda, e a segunda, mais à direita. (Passe o mouse no (+) e confira o conteúdo abaixo) Tendo em vista a complexidade das gramáticas livres de contexto, é necessário analisar, por outro ângulo, sua construção, mediante definições, convenções, derivações e exemplos comentados. Ademais, é possível afirmar que elas são tidas como superiores às expressões regulares, que também são livres de contexto. SAIBA MAIS derivação mais à esquerda: E → - E → - ( E ) → - ( E + E ) → - ( id + E ) → - ( id + id ) derivação mais à direita: E → - E → - ( E ) → - ( E + E ) → - ( E + id ) → - ( id + id ) E-Book - Apostila 8 - 32 Leia as páginas 125 a 131 do livro indicado a seguir, em que os autores abordam a sintaxe da construção das linguagens de programação e as definições da gramática livre de contexto, com exemplos de expressões e de convenções de notação. Ademais, os autores explicam como ocorre a derivação e falam sobre a construção de uma árvore de derivação, entre outros assuntos. Acesse sua biblioteca virual e confira a leitura disponível no link: https://plataforma.bvirtual.com.br/Leitor/Publicacao/280/pdf/0 Agora que já compreendemos que a gramática é responsável pelo regramento de uma linguagem, estamos prontos para aprender sobre linguagem de programação e compiladores. Linguagem de programação Desde sempre, os computadores precisam receber dos usuários e programadores instruções de entrada para processamento. Esse processamento exige a execução de sistemas ou programas, sendo resultado de um conjunto de instruções que determinam o que a máquina deve fazer. Segundo Price e Toscani (2001, p. 1): " [...] no início não tínhamos programas como conhecemos hoje, os computadores eram limitados e com baixo poder de processamento. As instruções eram inseridas utilizando notação binária, produzindo uma comunicação entre usuário e máquina direta, e usando sequências de zeros e uns". Com o passar dos anos, a programação usando notação binária foi ficando cada vez mais complexa, principalmente com o aumento do poder de processamento dos computadores. Foi necessário, então, encontrar uma forma mais intuitiva e prática de enviar instruções às máquinas e escrever programas. Nesse sentido, começaram a ser desenvolvidas as linguagens de programação, bem como tradutores. As linguagens de programação, diferentemente das linguagens naturais, têm um únicoobjetivo: comunicar comandos computacionais por meio de um conjunto de palavras-chaves, símbolos, ordens e regras sintáticas e semânticas, compostos por dados e algoritmos responsáveis por permitir o entendimento entre máquina e programador. Essas linguagens chegam às máquinas por meio de tradutores, que se dividem em compiladores e interpretadores. https://plataforma.bvirtual.com.br/Leitor/Publicacao/280/pdf/0 E-Book - Apostila 9 - 32 Compiladores De acordo com Louden (2004), os compiladores são sistemas de informática que transformam uma linguagem compreensível por humanos em um código compreensível por máquinas. Um compilador recebe como entrada um programa escrito na linguagem-fonte e produz um sistema resultado na linguagem-alvo. Costumeiramente, o código-fonte é construído com uma linguagem de alto nível, como C++ ou C. A linguagem-alvo é um código-objeto. REFLITA Quando se inventou o computador, criou-se uma máquina a mais; quando se criou o compilador, criou-se uma nova era tecnológica. Segundo Aho et al. (2008, p. 1): E-Book - Apostila 10 - 32 A fim de compreender melhor essa ideia, observe a figura a seguir. FIGURA 1 - Compilador Fonte: AHO et al., 2008, p. 1. [...] colocando de forma bem simples, um compilador é um programa que recebe como entrada um programa em uma linguagem de programação – a linguagem-fonte – e o traduz para um programa equivalente em outra linguagem – a linguagem-objeto [...]. Um papel importante do compilador é relatar quaisquer erros no programa-fonte detectados durante esse processo de tradução. E-Book - Apostila 11 - 32 As linguagens de programação evoluíram muito ao longo dos anos, das mais simples, do ponto de vista da máquina, até as de alto nível, tidas como mais fáceis para o entendimento humano. Em meados de 1950, surgiu a Assembly, linguagem simples para os computadores, mas tida como complexa para os programadores humanos. Buscando melhorar essa relação, muitas linguagens surgiram depois disso. Em 1954, surgiu o Fortran, linguagem de programação conhecida como percursora das linguagens de alto nível. Em 1960, surgiu o ALGOL, linguagem conhecida também como uma importante linguagem científica. A primeira linguagem que se popularizou comercialmente surgiu em 1958, o COBOL. Atualizada até 2002, ela ainda pode ser encontrada em diversas aplicações do nosso dia a dia. Exemplos disso são os famosos sistemas de tela azul ou preta com letras cinzas ou verdes utilizados em redes de varejos ou instituições bancárias antes do advento dos sistemas web. Em 1970, surgiu a PASCAL, linguagem que permitia aos usuários definirem tipos. Os sistemas web trouxeram linguagens como Java, Python, Perl, Visual Basic e PHP, todas com orientação a objeto. Quando falamos em IA (Inteligência Artificial), é importante citar, ainda, o surgimento, em 1960, da linguagem Lisp, que evoluiu para Common Lisp, e da linguagem Prolog, nos anos 1970. Na atualidade, merecem destaque: Python, C++/C, Lua, Java, JavaScript e Swift. No infográfico a seguir, apresentaremos as principais linguagens de programação, de 1940 até 1990. (Clique nos (•) para visualizar o conteúdo) Recurso Externo Recurso é melhor visualizado no formato interativo Agora que você já conhece as principais linguagens de programação, é necessário conhecer alguns princípios relativos a elas. E-Book - Apostila 12 - 32 REFLITA Na atualidade, temos uma série de novas linguagens orientadas a objeto para aplicação web. Assim, chegaremos ao dia em que as linhas de código não serão mais necessárias. A programação será toda por comandos de voz e gráfica? Podemos citar quatro princípios para uma linguagem de programação e aplicação de suas técnicas formais que permitem o desenvolvimento de um compilador. São eles: tipos, nomes, semântica e sintaxe. Esse conhecimento é imprescindível, pois é possível surgir oportunidades de criar ou participar de um projeto de uma nova linguagem. Saiba mais clicando nas sanfonas a seguir. Tipos Tipos são os indicativos para o programador implementar as estruturas de armazenamento de dados e de execução de cálculos. E-Book - Apostila 13 - 32 Nomes Nomes são o conjunto de normas a serem seguidas. Por exemplo, em Java, uma variável pode conter letras, números e o caractere sublinhado (_), mas não pode começar com um número. Semântica A semântica, nos programas, diz respeito aos comandos com valores determinados, tida como importante porque permite que os programadores tenham um conhecimento preciso acerca das instruções da linguagem. Por exemplo: Calcule ( t1, t2); /* calcule ( t1, t2); /* é uma função; a semântica avalia se o método aceita dois parâmetros e se seus tipos e resultado são compatíveis. Por fim, a sintaxe abrange as regras e os regulamentos utilizados para escrever qualquer instrução em uma linguagem de programação, pertencendo ao formalismo das gramáticas livres de contexto. Interpretadores Os interpretadores são tradutores que leem um código-fonte de uma linguagem de programação interpretada e o converte em código executável. Um programa interpretador clássico é o BASIC, utilizado, geralmente, em ocasiões especiais. Atualmente, o Smalltalk, uma linguagem de programação orientada a objeto, tem sido muito difundido. Os comandos (linhas de código-fonte) executam todas as fases de tradução até obter o código-alvo, executando-o imediatamente. Por esse motivo, exigem a submissão a interpretadores sempre que executados. E-Book - Apostila 14 - 32 A figura a seguir demonstra o funcionamento de um interpretador. As entradas são o programa-fonte e a entrada do usuário, em que o interpretador produz a saída correspondente. FIGURA 1 - Árvore derivativa Fonte: Elaboração do autor, 2022. De acordo com Aho et al. (2008, p. 2), "[...] um interpretador é capaz de executar um melhor diagnóstico de erros que os compiladores, por executar o código 'instrução por instrução', enquanto que os compiladores apresentam agilidade na entrada e saída de informações/dados". Podemos entender, então, que não há uma tradução nesses casos, mas uma interpretação do código-fonte e da entrada de informação. Esse processo é lento e, geralmente, exige mais capacidade de espaço. Um bom exemplo dessa linguagem é o Java, explicando nossa costumeira reclamação de lentidão nos programas gerados. Outros exemplos de interpretação são: PHP, Scheme e Python. Clique nas sanfonas a seguir e conheça um pouco mais as vantagens e desvantagens da compilação com relação à interpretação. E-Book - Apostila 15 - 32 Vantagens da compilação com relação à interpretação Execução rápida, já que não necessita de qualquer tradução. Economia de memória na execução. Maior controle sobre o código produzido. Permite a otimização do código. Resulta em uma programa eficiente que interage diretamente com a máquina. Desvantagens da compilação com relação à interpretação Inadequada a usuários inexperientes, considerando que, para a verificação de erros, é necessário compilar o programa inteiro; já o interpretador pausa o programa durante a execução para a correção do erro. Perde-se a referência com o código-fonte, dificultando o apontamento do resultado do erro. Construção complexa. Permite desenvolver máquinas virtuais para plataformas diversificadas, resultando na geração de códigos intermediários de alta portabilidade. No próximo tópico, vamos conhecer as fases de um compilador. Fases de um compilador As fases de um compilador são duas: a fase de análise e a fase de síntese. Essa divisão objetiva trazer uma visão explícita e detalhada do processo de compilação. Na figura a seguir, podemos observar as fases de umcompilador. Nela, o fluxo de processos é executado durante a análise, com uma síntese de suas respectivas etapas, iniciando no programa-fonte até chegar ao código final-alvo. E-Book - Apostila 16 - 32 FIGURA 1 - Fases de um compilador Fonte: Elaboração do autor, 2022. Fase de análise ou front-end Essa fase particiona o programa em partes estruturadas pela gramática, sendo sua principal tarefa garantir que a sintaxe e a semântica do programa estejam corretas, ou seja, ela verifica se o código-fonte está correto, de acordo com as regras da linguagem. Podemos dividir a análise, ainda, em três partes, segundo Aho et al. (2008, p. 3). Léxica ou leitura (scanning) A léxica ou leitura (scanning) é responsável por verificar se os nomes das entidades do programa-fonte estão corretos, transformando o texto em um fluxo de tokens e criando as tabelas de símbolos. Os tokens constituem classes de símbolos, tais como palavras reservadas, delimitadores, identificadores etc. E-Book - Apostila 17 - 32 Exemplo: Enunciado: – montante := depósito + taxa * 55 – m1 := a2 + b3 * 55 Sintática A sintática é a fase que verifica se os comandos estão corretos, seja nas palavras correspondentes, seja na sua ordem. Além disso, efetua uma leitura do fluxo de tokens, validando sua estrutura e criando a árvore sintática. Exemplo: – while <expressão> do ; A estrutura <expressão> deve se apresentar sintaticamente correta, e sua avaliação deve retornar um valor do tipo lógico. Semântica E-Book - Apostila 18 - 32 A semântica é a fase responsável por garantir que as regras de semântica sejam cumpridas, verificando o contexto e se os comandos inseridos no código-fonte são compatíveis. Exemplo: Verifica variáveis declaradas e não utilizadas, bem como incompatibilidade de tipos, variável utilizada e não declarada etc. Fase de síntese ou back-end A fase de síntese visa construir o programa-objeto, a partir da representação intermediária desenvolvida na fase de análise. Gerenciamento da tabela de símbolos É a tabela responsável pelas informações (nomes, tipos e atributos), consultada e alimentada pelo compilador. Deve ser montada de forma que possibilite a extração rápida e a inserção de dados, mas sem deixar de ser compacta. E-Book - Apostila 19 - 32 Exemplo: Para variáveis: classe (var), tamanho, precisão, tipo. Parâmetros formais: classe (par), tipo. Subrotinas: classe (proc), número de parâmetros. Geração do código intermediário É o código-alvo, criado em etapas. As instruções são representadas em até três endereços. Exemplo: x = a + b / raiz(5) t1 = raiz(5) t2 = b / t1 t3 = a + t2 x = t3 E-Book - Apostila 20 - 32 Otimização do código Aqui, devemos transformar o código-fonte para obter um código limpo que permita que a máquina diminua o seu tempo de execução, o consumo de memória e/ou o tamanho do código. Exemplo: Enunciado: x1 := a1 + a2 * 53 t1:= inttoreal (53) t2 := a2 * t1 t3 := a1 + t2 x1 := t3 t1 := a2 * 53 x1 := a1 + t1 Geração do código É a fase de conclusão, ou seja, a fase final, que mostra o código pronto para ser executado e comercializado. Construindo compiladores E-Book - Apostila 21 - 32 As técnicas de desenvolvimento de compiladores são amplamente difundidas no campo da ciência da computação. São técnicas com algoritmos e estruturas de dados que integram os compiladores. Exemplos: tabelas pré-calculadas, mecanismo de pilhas, teoria dos grafos, alocação de memória, estrutura de dados etc. Pensando na temática da construção de compiladores, assista ao vídeo a seguir. Recurso Externo Recurso é melhor visualizado no formato interativo Temos, ainda, como opções de aplicações compiladoras: JavaCC e LISA. O JavaCC é uma ferramenta bastante popular e, segundo Rebelo (2002), permite a geração de programas simples e de alta complexidade para linguagens em C++ e Java, bem como para ferramentas de análise gramatical e de transformação de código-fonte. Além disso, permite a geração de analisadores léxicos e sintáticos com capacidade de depuração e de gerenciamento de erros. O JavaCC inclui como ferramentas adicionais o JJDoc e o JJtree. A primeira gera documentação em HTML, e a segunda permite construir, automaticamente, ações para a estrutura de árvore, durante a análise gramatical de um sistema. Conforme Rebelo (2002), a LISA é uma ferramenta capaz de fornecer um compilador utilizando métodos formais (expressões regulares), notação BNF (Backus-Naur Form) e gramática de atributos. Seu ambiente é tido como amigável por permitir escrever e descrever, formalmente, a linguagem de maneira simples e rápida. Ainda, é capaz de gerar analisadores léxicos, sintáticos e semânticos em C++. Para aprofundar o seu entendimento sobre linguagem de programação, acesse a dica a seguir. E-Book - Apostila 22 - 32 DICA Leia as páginas 5 a 9 do livro disponibilizado no link a seguir. A obra fornece informações claras, simples e didáticas sobre como programar em Java, com ênfase inicial em objetos. Trata-se de um livro essencial para alunos e profissionais que desejam aprofundar os seus conhecimentos sobre programação e desenvolvimento de software. Acesse dua biblioteca virtual e confira a leitura disponível em: https://plataforma.bvirtual.com.br/Leitor/Publicaca o/2660/pdf/0 O desenvolvimento de compiladores e de códigos-fonte sofreu diversas mudanças nas últimas décadas, principalmente com o surgimento e aperfeiçoamento de ferramentas capazes de interpretar e de gerar códigos de alto nível por meio da reutilização de programas. Hoje, temos à nossa disposição linhas de códigos e algoritmos de diferentes complexidades, como, por exemplo, os aplicativos em nossos smartphones. https://plataforma.bvirtual.com.br/Leitor/Publicacao/2660/pdf/0 E-Book - Apostila 23 - 32 Considerações finais Nesta unidade, você teve a oportunidade de: compreender os conceitos relacionados a gramáticas livres de contexto; entender o que é uma árvore de derivação; conhecer a evolução dos compiladores; diferenciar o front-end do back-end; compreender as diferenças entre compilador e interpretador; conhecer ferramentas para a construção de compiladores. Ao longo do material, apresentamos as gramáticas livres de contexto, suas derivações (árvores de derivação e derivação mais à direita ou mais à esquerda) e reduções. Também estudamos as linguagens de programação, sua evolução, princípios e paradigmas. Ainda, falamos sobre tradutores, como os compiladores e interpretadores. Os compiladores foram o nosso foco principal, então, falamos sobre sua conceituação e estrutura, de modo a entender as fases do processo de compilação. Por fim, abordamos a construção dos compiladores e falamos sobre JavaCC e LISA. Esperamos que você tenha aproveitado bastante o conteúdo! Agora que finalizamos o conteúdo, vamos testar os seus conhecimentos por meio do QUIZ a seguir. QUIZ E-Book - Apostila 24 - 32 Leia o enunciado a seguir. Sabendo que a gramática é a responsável pelo grupo de símbolos não terminais ou terminais que permitem a geração de strings de uma linguagem, Noam Chomsky, linguista norte-americano, concebeu a hierarquia de linguagens. E o que seria essa hierarquia de linguagens? Assinale a alternativa correta, a seguir. Resposta Correta: Resposta correta. Noam Chomsky, linguista norte- americano, concebeu uma hierarquia de linguagens, sendo esta composta, de fato, por linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. Linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. a Linguagens numeráveis recursivamente,linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. b E-Book - Apostila 25 - 32 Resposta Incorreta: Resposta incorreta. Noam Chomsky, linguista norte- americano, concebeu uma hierarquia de linguagens, sendo esta composta por linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. Resposta Incorreta: Resposta incorreta. Noam Chomsky, linguista norte- americano, concebeu uma hierarquia de linguagens, sendo esta composta por linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. Resposta Incorreta: Resposta incorreta. Noam Chomsky, linguista norte- americano, concebeu uma hierarquia de linguagens, sendo esta composta por linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. Linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens irregulares. c Linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens presas de contexto e linguagens regulares. d E-Book - Apostila 26 - 32 Resposta Incorreta: Resposta incorreta. Noam Chomsky, linguista norte- americano, concebeu uma hierarquia de linguagens, sendo esta composta por linguagens enumeráveis recursivamente, linguagens sensíveis ao contexto, linguagens livres de contexto e linguagens regulares. Leia o enunciado a seguir. Atualmente, um desenvolvedor de compiladores pode contar com diversas ferramentas que oferecem recursos como editores de texto, depuradores, gerenciamento de versões, profilers e ferramentas de testes. Assinale a alternativa que indique corretamente quais ferramentas podem ser empregadas na construção de compiladores. Linguagens enumeráveis recursivamente, linguagens insensíveis ao contexto, linguagens livres de contexto e linguagens regulares. e Geradores de analisadores sintáticos, geradores de analisadores léxicos e geradores de analisadores disléxicos. a E-Book - Apostila 27 - 32 Resposta Incorreta: Resposta incorreta. As ferramentas mais adequadas para uso são aquelas capazes de ocultar os detalhes de seus algoritmos, produzindo resultados facilmente integrados ao computador, por meio de linguagens específicas e sofisticadas. Algumas ferramentas empregadas na construção de compiladores são: geradores de analisadores sintáticos; geradores de analisadores léxicos; mecanismos de tradução dirigida por sintaxe; geradores de códigos; mecanismos de fluxo de análise de dados; e conjunto de ferramentas para construção de compiladores. Resposta Incorreta: Resposta incorreta. As ferramentas mais adequadas para uso são aquelas capazes de ocultar os detalhes de seus algoritmos, produzindo resultados facilmente integrados ao computador, por meio de linguagens específicas e sofisticadas. Algumas ferramentas empregadas na construção de compiladores são: geradores de analisadores sintáticos; geradores de analisadores léxicos; mecanismos de tradução dirigida por sintaxe; geradores de códigos; mecanismos de fluxo de análise de dados; e conjunto de ferramentas para construção de compiladores. Geradores de analisadores sintáticos, geradores de analisadores disléxicos e geradores de códigos.b Geradores de tabela de símbolos, geradores de analisadores disléxicos e geradores de códigos.c E-Book - Apostila 28 - 32 Resposta Incorreta: Resposta incorreta. As ferramentas mais adequadas para uso são aquelas capazes de ocultar os detalhes de seus algoritmos, produzindo resultados facilmente integrados ao computador, por meio de linguagens específicas e sofisticadas. Algumas ferramentas empregadas na construção de compiladores são: geradores de analisadores sintáticos; geradores de analisadores léxicos; mecanismos de tradução dirigida por sintaxe; geradores de códigos; mecanismos de fluxo de análise de dados; e conjunto de ferramentas para construção de compiladores. Resposta Incorreta: Resposta incorreta. As ferramentas mais adequadas para uso são aquelas capazes de ocultar os detalhes de seus algoritmos, produzindo resultados facilmente integrados ao computador, por meio de linguagens específicas e sofisticadas. Algumas ferramentas empregadas na construção de compiladores são: geradores de analisadores sintáticos; geradores de analisadores léxicos; mecanismos de tradução dirigida por sintaxe; geradores de códigos; mecanismos de fluxo de análise de dados; e conjunto de ferramentas para construção de compiladores. Geradores de analisadores sintáticos, geradores de analisadores léxicos e geradores de analisadores derivativos. d Geradores de códigos, geradores de analisadores léxicos e geradores de analisadores sintáticos.e E-Book - Apostila 29 - 32 Resposta Correta: Resposta correta. As ferramentas mais adequadas para uso são aquelas capazes de ocultar os detalhes de seus algoritmos, produzindo resultados facilmente integrados ao computador, por meio de linguagens específicas e sofisticadas. Algumas ferramentas empregadas na construção de compiladores são: geradores de analisadores sintáticos; geradores de analisadores léxicos; mecanismos de tradução dirigida por sintaxe; geradores de códigos; mecanismos de fluxo de análise de dados; e conjunto de ferramentas para construção de compiladores. Leia o enunciado a seguir. A fase de análise ou front-end é uma das fases da construção de um compilador, e sua finalidade principal é garantir que a sintaxe e a semântica do programa estejam corretas, de acordo com as regras da linguagem. Essa análise pode ser dividida em três partes. Quais seriam elas? Assinale a alternativa correta, a seguir. Leitura, sintática e derivada.a E-Book - Apostila 30 - 32 Resposta Incorreta: Resposta incorreta. A fase de análise ou front-end pode ser dividida em três partes: léxica ou leitura (scanning): transforma o texto em fluxo de tokens; sintática: verifica se os comandos estão corretos; e semântica: garante que as regras de semânticas serão cumpridas. Resposta Incorreta: Resposta incorreta. A fase de análise ou front-end pode ser dividida em três partes: léxica ou leitura (scanning): transforma o texto em fluxo de tokens; sintática: verifica se os comandos estão corretos; e semântica: garante que as regras de semânticas serão cumpridas. Resposta Correta: Resposta correta. De fato, a fase de análise ou front- end pode ser dividida em três partes: léxica ou leitura (scanning): transforma o texto em fluxo de tokens; sintática: verifica se os comandos estão corretos; e semântica: garante que as regras de semânticas serão cumpridas. Disléxica, sintática e semântica.b Scanning, sintática e semântica.c Tokens, scanning e semântica.d E-Book - Apostila 31 - 32 Resposta Incorreta: Resposta incorreta. A fase de análise ou front-end pode ser dividida em três partes: léxica ou leitura (scanning): transforma o texto em fluxo de tokens; sintática: verifica se os comandos estão corretos; e semântica: garante que as regras de semânticas serão cumpridas. Resposta Incorreta: Resposta incorreta. A fase de análise ou front-end pode ser dividida em três partes: léxica ou leitura (scanning): transforma o texto em fluxo de tokens; sintática: verifica se os comandos estão corretos; e semântica: garante que as regras de semânticas serão cumpridas. Referências bibliográficas AHO, A. V. et al. Compiladores: princípios, técnicas e ferramentas. São Paulo: Pearson Addison-Wesley, 2008. ASCENCIO, A. F. G.; ARAÚJO, G. S. Estruturas de dados: algoritmos, análise da complexidade e implementações em Java e C/C++. São Paulo: Pearson Prentice Hall, 2010. Léxica, sintática e variável.e E-Book - Apostila 32 - 32 BERTOLINI, C. et al. Linguagem de programação I. 1. ed. Santa Maria: UAB/NTE/UFSM, 2019. Disponível em: https://repositorio.ufsm.br/bitstream/handle/1/18352/Curso_Lic-Cienc- Relig_Linguagem-Progracamacao.pdf. Acesso em: 9 maio2022. CONVERSE, T.; PARK, J. PHP 4: a Bíblia. 2. ed. Rio de Janeiro: Elsevier, 2003. DEITEL, P. Java: como programar. São Paulo: Pearson Education do Brasil, 2017. DEITEL, P.; DEITEL, H. C: como programar. 6. ed. São Paulo: Pearson Prentice Hall, 2011. DIVERIO, T. A.; MENEZES, P. B. Teoria da computação: máquinas universais e computabilidade. Porto Alegre: Grupo A, 2011. GRAMÁTICA. In: Dicionário Online de Português. Porto: 7Graus, [c2022]. Disponível em: https://www.dicio.com.br/gramatica//. Acesso em: 9 maio 2022. LOUDEN, K. C. Compiladores: princípios e práticas. 2. ed. São Paulo: Cengage Learning, 2004. MENEZES, P. B. Linguagens formais e autômatos. Porto Alegre: Grupo A, 2011. PRICE, A. M. A.; TOSCANI, S. S. Implementação de linguagens de programação: compiladores. Porto Alegre: Sagra-Luzzatto, 2001. REBELO, M. N. Desenvolvimento de um protótipo de um gerador de analisador léxico. 2002. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) - Universidade Regional de Blumenau, Blumenau, 2002. Disponível em: http://campeche.inf.furb.br/tccs/2002-II/2002- 2michelnogueirarebelovf.pdf. Acesso em: 9 maio 2022. SIPSER, M. Introdução à teoria da computação. São Paulo: Cengage Learning, 2007. SOMMERVILLE, I. Engenharia de software. 8. ed. São Paulo: Pearson Addison- Wesley, 2007. TOSCANI, L. V. Complexidade de algoritmos. 3. ed. Porto Alegre: Bookman, 2012. https://repositorio.ufsm.br/bitstream/handle/1/18352/Curso_Lic-Cienc-Relig_Linguagem-Progracamacao.pdf https://www.dicio.com.br/gramatica// http://campeche.inf.furb.br/tccs/2002-II/2002-2michelnogueirarebelovf.pdf%3E
Compartilhar