Baixe o app para aproveitar ainda mais
Prévia do material em texto
1. O que é uma linguagem formal? Uma linguagem formal é um conjunto de cadeias de símbolos que seguem certas regras ou padrões definidos. Essas regras são especificadas por meio de uma gramática formal ou outras representações formais, e as linguagens formais são estudadas em teoria da computação e linguagens de programação. 2. Quais são os principais elementos de uma linguagem formal? Os principais elementos de uma linguagem formal são o alfabeto (um conjunto finito de símbolos), as regras de formação (que definem como as cadeias de símbolos podem ser construídas) e um conjunto de sentenças ou expressões que são consideradas corretas ou válidas na linguagem. 3. Diferencie entre uma linguagem regular e uma linguagem livre de contexto. Uma linguagem regular é uma linguagem formal que pode ser reconhecida por um autômato finito, como um autômato finito determinístico (AFD) ou um autômato finito não determinístico (AFND). Já uma linguagem livre de contexto é uma linguagem formal que pode ser reconhecida por uma gramática livre de contexto, que possui regras de produção para gerar cadeias de símbolos. 4. O que é um autômato finito? Um autômato finito é um modelo abstrato de computação que consiste em um conjunto finito de estados, uma entrada, uma função de transição e estados finais. Ele pode ler a entrada, modificar seu estado interno com base na entrada e na função de transição, e pode aceitar ou rejeitar a entrada com base no estado em que se encontra. 5. Quais são as principais partes de um autômato finito determinístico (AFD)? Um AFD consiste em um conjunto finito de estados, um alfabeto de entrada, uma função de transição que especifica como o autômato muda de estado com base na entrada, um estado inicial e um conjunto de estados finais ou de aceitação. 6. Descreva o processo de conversão de um autômato finito não determinístico (AFND) para um AFD. A conversão de um AFND para um AFD envolve a construção de um novo autômato que simule o comportamento não determinístico do AFND. Isso é feito através do uso de técnicas como a construção de subconjuntos ou o algoritmo de Thompson. O processo envolve a identificação de conjuntos de estados do AFND que podem ser alcançados a partir de um determinado estado com um símbolo de entrada e, em seguida, esses conjuntos são mapeados como estados no AFD resultante. 7. O que é uma gramática formal? Uma gramática formal é uma notação matemática que descreve a estrutura de uma linguagem formal. Ela consiste em um conjunto de regras de produção que especificam como as cadeias de símbolos podem ser formadas. As gramáticas formais são amplamente utilizadas em linguagens de programação e compiladores. 8. Quais são os tipos de gramáticas formais mais conhecidos? Os tipos de gramáticas formais mais conhecidos são: gramáticas regulares (Tipo 3), gramáticas livres de contexto (Tipo 2), gramáticas sensíveis ao contexto (Tipo 1) e gramáticas irrestritas (Tipo 0), também conhecidas como gramáticas recursivas. 9. Explique o conceito de análise léxica e qual é o papel de um analisador léxico em um compilador. A análise léxica é a primeira fase do processo de compilação, na qual a entrada (normalmente um programa fonte) é dividida em componentes léxicos, como palavras-chave, identificadores, símbolos e constantes. Um analisador léxico, também conhecido como scanner, é responsável por executar essa tarefa. Ele lê a sequência de caracteres de entrada e produz uma sequência de tokens, que são os componentes léxicos reconhecidos. 10. O que são expressões regulares? Forneça um exemplo de expressão regular. Expressões regulares são sequências de caracteres que definem um padrão de busca em um texto. Elas são amplamente utilizadas em processamento de texto, busca de padrões e linguagens de programação. Um exemplo de expressão regular é a seguinte: "a*b", que representa uma sequência de zero ou mais caracteres 'a' seguida de um 'b'. 11. Qual é a diferença entre expressões regulares e gramáticas regulares? Expressões regulares são usadas para representar padrões de busca ou manipulação de texto, enquanto as gramáticas regulares são usadas para descrever a estrutura de uma linguagem formal. Expressões regulares são mais simples e menos expressivas do que gramáticas regulares. 12. O que é o Teorema de Pumping para linguagens regulares? O Teorema de Pumping para linguagens regulares é um resultado teórico que afirma que toda linguagem regular possui um comprimento mínimo a partir do qual qualquer palavra dessa linguagem pode ser "bombeada" (dividida em partes e repetida) de uma maneira que ainda pertença à linguagem. Esse teorema é frequentemente usado para mostrar que certas linguagens não são regulares. 13. O que é um autômato de pilha (ou autômato com pilha)? Um autômato de pilha, também conhecido como autômato com pilha, é um modelo abstrato de computação que estende um autômato finito adicionando uma pilha. A pilha permite armazenar informações e realizar operações de empilhar (push) e desempilhar (pop). Esses autômatos são mais poderosos do que autômatos finitos e podem reconhecer linguagens livres de contexto. 14. Como um autômato de pilha difere de um autômato finito? Um autômato de pilha difere de um autômato finito ao adicionar uma pilha como uma nova forma de memória. Enquanto um autômato finito possui apenas uma memória limitada em seus estados, um autômato de pilha pode usar a pilha para armazenar informações adicionais e fazer transições com base no topo da pilha. Isso permite ao autômato de pilha reconhecer linguagens livres de contexto, que estão além da capacidade de um autômato finito. 15. Explique o conceito de linguagens recursivas e recursivamente enumeráveis. Uma linguagem recursiva é uma linguagem formal que pode ser decidida por uma máquina de Turing, ou seja, existe um algoritmo que pode dizer se uma cadeia pertence à linguagem ou não. Por outro lado, uma linguagem recursivamente enumerável (ou apenas enumerável) é uma linguagem que pode ser reconhecida por uma máquina de Turing, mas não necessariamente decidida. Isso significa que existe uma máquina de Turing que pode aceitar cadeias na linguagem, mas pode entrar em um loop infinito para cadeias que não pertencem à linguagem. 16. O que é uma linguagem recursiva? Uma linguagem recursiva é uma linguagem formal para a qual existe uma máquina de Turing que, quando recebe uma cadeia de entrada, pode decidir se a cadeia pertence ou não à linguagem. Em outras palavras, é possível construir um algoritmo que, ao ser executado, sempre termina e determina se uma cadeia faz parte da linguagem ou não. 17. O que é uma linguagem recursivamente enumerável? Uma linguagem recursivamente enumerável, também conhecida como linguagem semidecidível, é uma linguagem formal para a qual existe uma máquina de Turing que, quando recebe uma cadeia de entrada pertencente à linguagem, eventualmente para e aceita a cadeia. No entanto, se a cadeia não pertence à linguagem, a máquina de Turing pode continuar em execução indefinidamente ou rejeitar a cadeia. 18. Diferencie entre uma linguagem recursiva e uma linguagem recursivamente enumerável. A principal diferença entre uma linguagem recursiva e uma linguagem recursivamente enumerável é que uma linguagem recursiva possui um algoritmo que pode decidir se uma cadeia pertence ou não à linguagem, enquanto uma linguagem recursivamente enumerável possui uma máquina de Turing que pode apenas aceitar as cadeias pertencentes à linguagem, mas pode não parar ou rejeitar cadeias que não pertencem à linguagem. 19. O que é um autômato finito não determinístico (AFND)? Um autômato finito não determinístico (AFND) é uma máquina abstrata que pode estar em vários estados simultaneamente e possui transições não determinísticas, onde a escolha do próximo estadonão é única. Um AFND possui um conjunto de estados, um alfabeto de entrada, transições entre estados e um estado inicial, além de um ou mais estados finais. 20. Quais são as principais partes de um autômato finito não determinístico (AFND)? As principais partes de um autômato finito não determinístico são: Um conjunto finito de estados. Um alfabeto de entrada. Transições entre estados, que podem ser não determinísticas. Um estado inicial. Um conjunto de estados finais. 21. Explique o conceito de linguagem livre de contexto. Uma linguagem livre de contexto é uma linguagem formal que pode ser descrita por meio de uma gramática livre de contexto. Nessa gramática, as regras de produção são aplicadas aos símbolos não terminais para gerar sequências de símbolos terminais e não terminais que compõem a linguagem. 22. O que é uma gramática livre de contexto ambígua? Uma gramática livre de contexto é ambígua se existem duas ou mais derivações distintas para a mesma cadeia de símbolos. Isso significa que a gramática possui múltiplas interpretações para a mesma sequência de símbolos, o que pode levar a uma análise sintática inconsistente. 23. Como se resolve a ambiguidade em uma gramática livre de contexto? Para resolver a ambiguidade em uma gramática livre de contexto, é necessário modificar as regras de produção para eliminar as possíveis derivações ambíguas ou introduzir precedências e associatividades claras nas regras. A ideia é tornar a gramática unívoca, garantindo que cada cadeia de símbolos tenha uma única interpretação. 24. O que é um analisador sintático (parser)? Um analisador sintático, também conhecido como parser, é um componente de um compilador que realiza a análise sintática de um programa de acordo com as regras de uma gramática formal. Ele verifica se a sequência de tokens de entrada segue a estrutura gramatical definida pela gramática e produz uma árvore de análise sintática (parse tree) que representa a estrutura hierárquica do programa. 25. Quais são os tipos de analisadores sintáticos mais conhecidos? Os tipos de analisadores sintáticos mais conhecidos são: Analisadores sintáticos descendentes (top-down), como o analisador LL(1). Analisadores sintáticos ascendentes (bottom-up), como o analisador LR(1) e o analisador LALR(1). Analisadores sintáticos preditivos recursivos. 26. O que é a hierarquia de Chomsky? A hierarquia de Chomsky é uma classificação das gramáticas formais proposta pelo linguista Noam Chomsky. Ela divide as gramáticas em quatro níveis hierárquicos, sendo eles: gramáticas regulares, gramáticas livres de contexto, gramáticas sensíveis ao contexto e gramáticas irrestritas. Cada nível contém as classes de linguagens que podem ser geradas pelas respectivas gramáticas. 27. Descreva os quatro tipos de linguagens na hierarquia de Chomsky. Linguagens Regulares: Podem ser reconhecidas por um autômato finito. São representadas por gramáticas regulares. Linguagens Livres de Contexto: Podem ser reconhecidas por um autômato de pilha. São representadas por gramáticas livres de contexto. Linguagens Sensíveis ao Contexto: Podem ser reconhecidas por uma máquina de Turing linearmente limitada. São representadas por gramáticas sensíveis ao contexto. Linguagens Irrestritas: Podem ser reconhecidas por uma máquina de Turing universal. São representadas por gramáticas irrestritas. 28. O que é o lema do bombeamento para linguagens livres de contexto? O lema do bombeamento para linguagens livres de contexto é uma propriedade das linguagens livres de contexto que afirma que, se uma linguagem é livre de contexto, então qualquer cadeia longa o suficiente pertencente à linguagem pode ser dividida em partes que podem ser repetidas (bombeadas) um número qualquer de vezes e ainda permanecer na linguagem. 29. O que é uma máquina de Turing? Uma máquina de Turing é um modelo abstrato de um computador que pode executar qualquer algoritmo computacional. Ela consiste em uma fita infinita dividida em células, uma cabeça de leitura/escrita que pode se mover para a esquerda ou para a direita ao longo da fita, e uma tabela de transição que define como a máquina se comporta de acordo com o símbolo lido na fita. 30. Explique o conceito de computabilidade e decidibilidade em relação às linguagens formais. Computabilidade refere-se à capacidade de um problema ser resolvido ou computado por meio de um algoritmo. Uma linguagem é computável se existe um algoritmo que pode decidir se uma determinada cadeia pertence ou não à linguagem. Decidibilidade é uma propriedade das linguagens formais que indica se um problema relacionado a uma linguagem pode ser decidido por um algoritmo. Uma linguagem é decidível se existe um algoritmo que pode determinar, em tempo finito, se uma cadeia pertence ou não à linguagem. 31. O que é uma linguagem irrestrita? Uma linguagem irrestrita, também conhecida como linguagem recursivamente enumerável, é uma linguagem formal que não possui restrições em sua estrutura ou nas regras de produção. Ela pode ser reconhecida por uma máquina de Turing, que é uma máquina teórica com capacidade de memória ilimitada. 32. Qual é o poder expressivo de uma gramática irrestrita? Uma gramática irrestrita é capaz de gerar linguagens irrestritas, que são as mais poderosas em termos de expressividade na hierarquia de Chomsky. Elas podem representar qualquer linguagem recursivamente enumerável, incluindo linguagens regulares e linguagens livres de contexto. 33. O que é um autômato de Turing? Um autômato de Turing é uma máquina teórica proposta por Alan Turing em 1936. Ele consiste em uma fita infinita dividida em células, onde cada célula pode armazenar um símbolo. A máquina possui uma cabeça de leitura/escrita que lê o símbolo em uma célula e pode escrever um novo símbolo nessa célula. O comportamento da máquina é definido por um conjunto de regras de transição que determinam como ela se move pela fita e muda de estado em resposta aos símbolos lidos. 34. Como um autômato de Turing difere de um autômato finito? Um autômato de Turing é mais poderoso que um autômato finito em termos de capacidade de processamento. Enquanto um autômato finito possui uma memória limitada, representada por estados finitos, um autômato de Turing possui uma fita infinita como memória, permitindo a manipulação de uma quantidade arbitrariamente grande de informações. 35. Quais são os componentes principais de um autômato de Turing? Os principais componentes de um autômato de Turing são: Uma fita infinita dividida em células, onde cada célula pode armazenar um símbolo. Uma cabeça de leitura/escrita que lê e escreve símbolos na fita. Um conjunto de estados que define o comportamento da máquina. Um estado inicial que indica o estado em que a máquina começa a operar. Um conjunto de regras de transição que especifica como a máquina se move pela fita e muda de estado em resposta aos símbolos lidos. 36. O que é a parada de Turing? A parada de Turing refere-se à capacidade de um autômato de Turing de parar sua execução em um estado final ou de rejeição. Isso ocorre quando não há mais regras de transição aplicáveis para o símbolo lido pela cabeça de leitura/escrita. A parada de Turing é um conceito central na teoria da computabilidade e é usado para definir a noção de problemas indecidíveis. 37. O que é uma linguagem Turing-reconhecível? Uma linguagem Turing-reconhecível, também conhecida como recursivamente enumerável, é uma linguagem que pode ser reconhecida por uma máquina de Turing. Isso significa que existe um autômato de Turing que para em um estado de aceitação para todas as cadeias pertencentes à linguagem, mas pode não parar ou rejeitar as cadeias que não pertencem à linguagem. 38. Qual é a relação entre linguagens recursivas e linguagens Turing-reconhecíveis? Todas as linguagensrecursivas são Turing-reconhecíveis. Isso significa que, se uma linguagem é decidível, ou seja, existe um algoritmo que pode determinar se uma cadeia pertence ou não à linguagem, então ela é Turing-reconhecível. No entanto, existem linguagens Turing- reconhecíveis que não são recursivas, ou seja, não possuem um algoritmo que as decida. 39. O que é uma linguagem decidível? Uma linguagem decidível, também conhecida como recursiva, é uma linguagem Turing- reconhecível para a qual existe um algoritmo que, dado qualquer cadeia de entrada, sempre termina e determina se a cadeia pertence ou não à linguagem. Em outras palavras, uma linguagem decidível é aquela em que é possível resolver o problema de pertinência para todas as cadeias. 40. Explique o conceito de hierarquia de Chomsky. A hierarquia de Chomsky é uma classificação das gramáticas formais proposta pelo linguista Noam Chomsky em 1956. Ela divide as gramáticas em quatro níveis, ou classes, com base nas restrições impostas às regras de produção. A hierarquia de Chomsky é usada para estudar as propriedades e capacidades expressivas das linguagens associadas a essas gramáticas. 41. Quais são as quatro classes de linguagens na hierarquia de Chomsky e quais são suas restrições? As quatro classes de linguagens na hierarquia de Chomsky são: Linguagens Tipo 3 (Regular): São linguagens que podem ser geradas por gramáticas regulares, que possuem regras de produção com a forma A -> aB ou A -> a, onde A e B são símbolos não terminais, a é um símbolo terminal e ε representa a palavra vazia. Linguagens Tipo 2 (Livres de Contexto): São linguagens que podem ser geradas por gramáticas livres de contexto, que possuem regras de produção com a forma A -> α, onde A é um símbolo não terminal e α é uma sequência de símbolos terminais e/ou não terminais. Linguagens Tipo 1 (Sensíveis ao Contexto): São linguagens que podem ser geradas por gramáticas sensíveis ao contexto, que possuem regras de produção com a forma α -> β, onde α e β são sequências de símbolos terminais e/ou não terminais, e a sequência α é pelo menos tão longa quanto a sequência β. Linguagens Tipo 0 (Irrestritas): São linguagens que podem ser geradas por gramáticas irrestritas, que não possuem restrições nas regras de produção. 42. O que é a forma normal de Chomsky para gramáticas livres de contexto? A forma normal de Chomsky é uma forma normalizada para gramáticas livres de contexto, onde todas as regras de produção têm uma das duas formas: A -> BC ou A -> a, onde A, B e C são símbolos não terminais, e a é um símbolo terminal. Além disso, a gramática na forma normal de Chomsky não possui regras de produção que gerem a palavra vazia (ε). 43. O que é o problema da palavra vazia em gramáticas livres de contexto? O problema da palavra vazia em gramáticas livres de contexto é o problema de determinar se uma gramática livre de contexto gera a palavra vazia (ε). Isso envolve verificar se é possível gerar a palavra vazia a partir do símbolo inicial da gramática, usando as regras de produção da gramática. O problema da palavra vazia é importante para a análise sintática e para determinar se uma cadeia pertence à linguagem gerada pela gramática. 44. Explique o conceito de análise sintática e qual é o papel de um analisador sintático em um compilador. A análise sintática, também conhecida como parsing, é uma etapa do processo de compilação que verifica se uma sequência de tokens de entrada segue a estrutura gramatical definida por uma determinada gramática formal. O analisador sintático, também chamado de parser, é responsável por essa tarefa. Ele utiliza a gramática formal para construir uma árvore sintática ou uma representação intermediária da estrutura da cadeia de entrada, permitindo a verificação de sua validade sintática. 45. O que é o algoritmo CYK (Cocke-Younger-Kasami) e qual é a sua finalidade? O algoritmo CYK, também conhecido como algoritmo de reconhecimento de strings CYK, é um algoritmo utilizado na análise sintática de linguagens livres de contexto. Ele determina se uma cadeia de entrada pode ser gerada por uma gramática livre de contexto. O algoritmo CYK utiliza uma tabela para armazenar informações sobre as possíveis derivações de subcadeias da cadeia de entrada, combinando regras de produção da gramática. Se a cadeia de entrada pode ser derivada pela gramática, o algoritmo CYK reconhece a linguagem. Caso contrário, a cadeia não pertence à linguagem. 46. O que é o conceito de linguagem sensível ao contexto? Uma linguagem sensível ao contexto é uma linguagem formal que pode ser reconhecida por uma máquina de Turing não determinística com uma fita ilimitada de leitura/escrita. Essas linguagens são mais expressivas do que as linguagens livres de contexto e menos restritivas do que as linguagens recursivas. 47. Quais são as principais características de uma gramática sensível ao contexto? Uma gramática sensível ao contexto possui regras de produção em que o lado esquerdo contém um único símbolo não terminal e o lado direito pode conter símbolos terminais e/ou não terminais. Além disso, as regras de produção podem modificar a cadeia de entrada substituindo um não terminal por outra sequência de símbolos. 48. O que é uma máquina de Turing não determinística (MTND)? Uma máquina de Turing não determinística é uma variante da máquina de Turing que permite múltiplas transições possíveis para um determinado estado e símbolo de leitura. Isso significa que, em cada passo, a máquina pode estar em vários estados diferentes. A escolha do próximo estado é não determinística e pode ser feita de acordo com algum critério, como uma escolha aleatória. 49. Quais são as diferenças entre uma máquina de Turing determinística e uma máquina de Turing não determinística? Uma máquina de Turing determinística possui apenas uma transição possível para cada estado e símbolo de leitura, enquanto uma máquina de Turing não determinística pode ter várias transições possíveis. Além disso, uma máquina de Turing determinística segue uma única sequência de execução determinada pelas transições, enquanto uma máquina de Turing não determinística pode estar em vários estados ao mesmo tempo e fazer várias escolhas não determinísticas. 50. Explique o conceito de máquinas de Turing universais. Uma máquina de Turing universal é uma máquina de Turing que pode simular o comportamento de qualquer outra máquina de Turing. Isso significa que ela pode executar qualquer algoritmo computável se receber a descrição dessa máquina como entrada. A noção de uma máquina de Turing universal é fundamental no estudo da computabilidade e mostra que existe um único modelo de computação capaz de realizar qualquer cálculo possível. 51. O que é o problema da parada (halting problem)? O problema da parada é um problema indecidível que questiona se é possível escrever um programa que, para qualquer outro programa e uma determinada entrada, possa determinar se o programa terminará sua execução ou entrará em um loop infinito. Alan Turing provou que esse problema é indecidível, o que significa que não há algoritmo que possa resolver o problema da parada para todas as entradas possíveis. 52. O que é uma linguagem recursivamente enumerável (RE)? Uma linguagem recursivamente enumerável, também conhecida como linguagem semidecidível, é uma linguagem para a qual existe uma máquina de Turing que, quando recebe uma cadeia de entrada pertencente à linguagem, eventualmente para e aceita a cadeia. No entanto, se a cadeia não pertence à linguagem, a máquina de Turing pode continuar em execução indefinidamente ou rejeitar a cadeia. 53. Como é possível demonstrar que uma linguagem é recursivamente enumerável? Para demonstrar que uma linguagem é recursivamente enumerável, é necessário construir uma máquina de Turing que possa enumerar todasas cadeias pertencentes à linguagem. Essa máquina de Turing deve ser capaz de gerar todas as cadeias aceitas pela linguagem em algum momento da sua execução. 54. O que é o conceito de redução de Turing? A redução de Turing é um método utilizado para mostrar que um problema é pelo menos tão difícil quanto outro problema conhecido. Isso é feito por meio da construção de uma transformação de uma instância de um problema para uma instância do outro problema de forma que a solução de um problema possa ser usada para resolver o outro problema. 55. Como uma redução de Turing é usada para mostrar que um problema é indecidível? Uma redução de Turing pode ser usada para mostrar que um problema é indecidível ao estabelecer uma correspondência entre uma instância de um problema conhecido como indecidível e uma instância do problema em questão. Se o problema conhecido é indecidível e a redução mostra que o problema em questão pode ser reduzido a ele, então o problema em questão também é indecidível. 56. O que é a tese de Church-Turing? A tese de Church-Turing é uma hipótese fundamental na teoria da computabilidade que sugere que qualquer função computável pode ser calculada efetivamente por uma máquina de Turing. Ela afirma que todas as definições razoáveis de algoritmos são equivalentes em termos de poder computacional, independentemente da sua representação específica. 57. Descreva o funcionamento de um autômato de pilha (AP) e suas principais partes. Um autômato de pilha é uma máquina abstrata que consiste em um autômato finito estendido com uma pilha. Ele possui uma pilha onde símbolos podem ser empilhados e desempilhados durante a computação. O autômato de pilha utiliza tanto os símbolos de entrada quanto o estado atual e o topo da pilha para determinar suas transições. As principais partes de um autômato de pilha são: Conjunto de estados: Representa os estados que o autômato pode assumir. Alfabeto de entrada: Conjunto de símbolos de entrada. Alfabeto da pilha: Conjunto de símbolos que podem ser empilhados e desempilhados. Função de transição: Define as transições possíveis entre os estados do autômato, levando em consideração os símbolos de entrada, os símbolos do topo da pilha e o estado atual. Estado inicial: Representa o estado inicial do autômato. Estado de aceitação: Indica os estados em que o autômato aceita a cadeia de entrada. 58. O que é uma linguagem livre de contexto determinística (LL)? Uma linguagem livre de contexto determinística, também conhecida como LL(k), é uma linguagem que pode ser reconhecida por um analisador sintático descendente que usa um número fixo k de símbolos de lookahead para tomar suas decisões de parsing. O LL(k) é uma classe de linguagens que é um subconjunto das linguagens livres de contexto. 59. Quais são as diferenças entre uma linguagem livre de contexto determinística (LL) e uma linguagem livre de contexto não determinística (LLN)? A principal diferença entre uma linguagem livre de contexto determinística (LL) e uma linguagem livre de contexto não determinística (LLN) está na forma como o parsing é realizado. Enquanto o LL(k) usa um número fixo k de símbolos de lookahead para tomar decisões de parsing, o LLN não tem essa restrição e pode fazer escolhas não determinísticas ao realizar o parsing. 60. O que é uma linguagem recursiva primitiva? Uma linguagem recursiva primitiva é uma classe de linguagens formais que pode ser gerada a partir de um conjunto inicial de símbolos usando operações primitivas, como concatenação, repetição e substituição. Essas operações podem ser aplicadas recursivamente para construir linguagens mais complexas. 61. Como uma linguagem recursiva primitiva se relaciona com a computabilidade e decidibilidade? As linguagens recursivas primitivas são um subconjunto das linguagens recursivamente enumeráveis. Isso significa que todas as linguagens recursivas primitivas são recursivamente enumeráveis, mas nem todas as linguagens recursivamente enumeráveis são recursivas primitivas. As linguagens recursivas primitivas são computáveis e decidíveis, o que significa que existe um algoritmo que pode determinar se uma cadeia pertence ou não à linguagem. 62. Explique o conceito de gramáticas sensíveis ao contexto. Gramáticas sensíveis ao contexto são gramáticas formais que geram linguagens sensíveis ao contexto. Elas possuem regras de produção em que o lado esquerdo pode conter uma sequência de símbolos de qualquer tamanho, desde que seja menor ou igual ao lado direito da regra. Essas gramáticas são mais expressivas do que as gramáticas livres de contexto, pois podem capturar estruturas mais complexas. 63. O que é um analisador léxico? Um analisador léxico, também conhecido como scanner, é a primeira etapa de um compilador. Ele analisa a sequência de caracteres de entrada e divide-a em unidades significativas chamadas de "tokens". Os tokens podem representar palavras-chave, identificadores, operadores, símbolos especiais, entre outros elementos da linguagem. 64. Como funciona o processo de análise léxica em um compilador? O processo de análise léxica envolve a leitura dos caracteres de entrada, agrupando-os em tokens que representam elementos da linguagem. Um analisador léxico utiliza expressões regulares ou autômatos finitos para descrever a estrutura léxica da linguagem. À medida que os caracteres são lidos, o analisador léxico identifica os padrões correspondentes aos tokens e os retorna para o próximo estágio do compilador. 65. Quais são as principais diferenças entre análise léxica e análise sintática? A análise léxica e a análise sintática são duas etapas distintas no processo de compilação: A análise léxica lida com a estrutura léxica da linguagem, identificando e agrupando os caracteres de entrada em tokens significativos. A análise sintática lida com a estrutura gramatical da linguagem, verificando se a sequência de tokens forma uma estrutura válida de acordo com a gramática da linguagem. A análise léxica é geralmente mais simples, pois lida com correspondências diretas entre caracteres e tokens, enquanto a análise sintática envolve a construção de uma árvore de análise ou uma tabela de derivação para validar a estrutura gramatical da linguagem. 66. O que é uma linguagem regular? Uma linguagem regular é uma linguagem formal que pode ser reconhecida ou gerada por um autômato finito ou expressa por uma expressão regular. Elas são caracterizadas por possuírem regras simples e restritas de formação. 67. Quais são os principais autômatos utilizados para reconhecer linguagens regulares? Os principais autômatos utilizados para reconhecer linguagens regulares são: Autômato Finito Determinístico (AFD). Autômato Finito Não Determinístico (AFND). Autômato com Pilha Determinístico (APD) e Autômato com Pilha Não Determinístico (APND). 68. Explique o funcionamento de um autômato finito determinístico (AFD). Um AFD possui um conjunto finito de estados, um alfabeto de entrada, uma função de transição que especifica o próximo estado com base no estado atual e no símbolo de entrada, um estado inicial e um conjunto de estados finais. O AFD lê uma cadeia de entrada símbolo por símbolo e, com base nas transições definidas, move-se de estado em estado. Se, ao final da leitura da cadeia, o AFD estiver em um estado final, a cadeia é aceita, caso contrário, é rejeitada. 69. O que é um autômato finito não determinístico (AFND)? Um AFND é um tipo de autômato finito onde existem transições não determinísticas, ou seja, em um determinado estado e com um determinado símbolo de entrada, podem existir várias opções de estados seguintes. O AFND pode estar em vários estados simultaneamente durante sua execução. 70. Como ocorre a conversão de um AFND para um AFD? A conversão de um AFND para um AFD é feita por meio do método conhecidocomo Subconjuntos ou Construção de Subconjuntos. Nesse método, cada estado do AFD resultante representa um conjunto de estados do AFND. A transição para um símbolo de entrada no AFD é determinada pelos estados alcançáveis a partir dos estados iniciais do AFND através dessa transição. Os estados finais do AFD são aqueles que contêm pelo menos um estado final do AFND. 71. O que é uma linguagem livre de contexto? Uma linguagem livre de contexto é uma linguagem formal que pode ser descrita por meio de uma gramática livre de contexto. Nessa gramática, as regras de produção são aplicadas aos símbolos não terminais para gerar sequências de símbolos terminais e não terminais que compõem a linguagem. 72. Descreva os componentes de uma gramática livre de contexto. Uma gramática livre de contexto consiste nos seguintes componentes: Um conjunto finito de símbolos terminais. Um conjunto finito de símbolos não terminais. Um símbolo inicial. Um conjunto finito de regras de produção, que especificam como os símbolos não terminais podem ser substituídos por sequências de símbolos terminais e não terminais. 73. O que é um analisador léxico? Um analisador léxico, também conhecido como scanner, é uma parte de um compilador responsável por realizar a análise léxica de um programa. Ele recebe o código fonte como entrada e divide-o em uma sequência de tokens, que são unidades léxicas significativas, como palavras-chave, identificadores, operadores, números, etc. 74. Qual é a função de um analisador sintático? Um analisador sintático, também conhecido como parser, é responsável por realizar a análise sintática de um programa. Ele recebe a sequência de tokens produzida pelo analisador léxico e verifica se a estrutura gramatical do programa está correta, de acordo com as regras de uma gramática formal. O analisador sintático produz uma árvore de análise sintática (parse tree) que representa a estrutura hierárquica do programa. 75. Quais são os principais tipos de analisadores sintáticos? Os principais tipos de analisadores sintáticos são: Analisadores sintáticos descendentes (top-down), como o analisador LL(1). Analisadores sintáticos ascendentes (bottom-up), como o analisador LR(1) e o analisador LALR(1). Analisadores sintáticos preditivos recursivos. 76. O que é a hierarquia de Chomsky? A hierarquia de Chomsky é uma classificação das gramáticas formais proposta pelo linguista Noam Chomsky. Ela divide as gramáticas em quatro tipos: 3, 2, 1 e 0. Cada tipo é mais restritivo que o anterior, sendo o Tipo 0 o mais abrangente e o Tipo 3 o mais restrito. 77. Explique o conceito de linguagem recursiva enumerável. Uma linguagem recursivamente enumerável, também conhecida como linguagem semidecidível, é uma linguagem que pode ser gerada por uma máquina de Turing parcialmente correta. Isso significa que existe um algoritmo que, quando aplicado a uma cadeia pertencente à linguagem, eventualmente a aceita, mas quando aplicado a uma cadeia não pertencente à linguagem, pode não parar ou rejeitar. 78. O que é o lema do bombeamento para linguagens regulares? O lema do bombeamento para linguagens regulares, também conhecido como lema do bombeamento de Myhill-Nerode, é um resultado teórico que estabelece uma propriedade fundamental das linguagens regulares. Ele afirma que toda linguagem regular possui uma propriedade chamada de propriedade de bombeamento, que permite a repetição de uma parte da cadeia de uma forma controlad 79. O que é uma máquina de Turing universal? Uma máquina de Turing universal é uma máquina de Turing que possui capacidade computacional equivalente à de qualquer outra máquina de Turing. Isso significa que ela pode simular o funcionamento de qualquer algoritmo computacional, desde que seja fornecido um programa adequado. 80. Diferencie entre decidibilidade e computabilidade. Decidibilidade refere-se à capacidade de um problema ser resolvido ou decidido por um algoritmo. Um problema é decidível se existe um algoritmo que, dado uma entrada, termina em um número finito de passos e produz uma resposta correta (sim ou não). Computabilidade, por outro lado, refere-se à capacidade de uma função ser calculada ou computada por um algoritmo. Uma função é computável se existe um algoritmo que, dado uma entrada, termina em um número finito de passos e produz o resultado correto.
Compartilhar