INE5317 Linguagens Formais e Compiladores AULA 9: Propriedades e Reconhecimento das Linguagens Livres do Contexto

Documentos relacionados
Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes

INE5317 Linguagens Formais e Compiladores AULA 6: Propriedades das Linguagens Regulares

INE5317 Linguagens Formais e Compiladores AULA 8: Linguagens Livres de Contexto

Linguagens Formais e Autômatos P. Blauth Menezes

INE5317 Linguagens Formais e Compiladores. AULA 4: Gramáticas

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Linguagens Formais e Autômatos P. Blauth Menezes

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto

INE5318 Construção de Compiladores. AULA 4: Análise Sintática

IV Gramáticas Livres de Contexto

Linguagens Formais e Autômatos. Simplificação de Gramáticas Livre do Contexto (GLC)

INE5317 Linguagens Formais e Compiladores. AULA 10: Anális e S intática

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

V Teoria de Parsing. Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada

INE5317 Linguagens Formais e Compiladores AULA 5: Autômatos Finitos

Automata e Linguagens Formais

Aula de 28/10/2013. sticas; Implementação. em Ruby

Linguagens Regulares. Prof. Daniel Oliveira

Gramática Livre de Contexto

Construção de Compiladores Aula 16 - Análise Sintática

Linguagens Formais e Autômatos P. Blauth Menezes

Teoria da Computação Aula 02 Introdução

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

Problemas decidíveis para LICs

INE5317 Linguagens Formais e Compiladores AULA 6: Autômatos Finitos Com S aída

Compiladores. Parser LL 10/13/2008

Linguagens Livres de Contexto

Gramática Livre de Contexto

Compiladores Aula 4. Celso Olivete Júnior.

Apostila 05 Assunto: Linguagens dos tipos 0 e 1

Problemas decidíveis para LICs

Marcos Castilho. DInf/UFPR. 21 de março de 2019

Gramáticas Livres de Contexto Parte 1

Análise sintática. Análise sintática. Top-down ou descendente. Com retrocesso: por tentativa e erro. Preditiva: para gramáticas LL(1) 09/04/2012

Matemática Discreta para Ciência da Computação

Compiladores. Análise Sintática

LINGUAGENS FORMAIS E AUTÔMATOS. Prova 2-10/06/ Prof. Marcus Ramos

Linguagens Livres do Contexto. Adaptado de H. Brandão

IBM1088 Linguagens Formais e Teoria da

SCC Capítulo 2 Linguagens Livres de Contexto e Autômatos de Pilha (versão 2)

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Análise Sintática. Fabiano Baldo

SCC Capítulo 2 Linguagens Livres de Contexto e Autômatos de Pilha

Exercícios Associados à Aula 28 (27/11/2013) Feitos em sala e em equipes

COMPILADORES. Revisão Linguagens formais Parte 02. Prof. Geovane Griesang

Concurso Público para provimento de cargo efetivo de Docentes. Edital 20/2015 CIÊNCIA DA COMPUTAÇÃO II Campus Rio Pomba

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

Analisadores Descendentes Tabulares; Cjs First Follow

Capítulo 9: Linguagens sensíveis ao contexto e autômatos linearmente limitados.

Autômato com pilha. IBM1088 Linguagens Formais e Teoria da Computação. Evandro Eduardo Seron Ruiz

INE5317 Linguagens Formais e Compiladores AULA 3: Introdução a Teoria da Computação

Como construir um compilador utilizando ferramentas Java

Análise Sintática LL(1)

SCC-5832: II. Ling. Livres de Contexto e Autômatos de Pilha

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Aula 8: Gramáticas Livres de Contexto

Linguagens Livres de Contexto

Introdução Definição Conceitos Básicos de Linguagem

Segunda Lista de Exercícios 2004/2...

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Linguagens Formais e Autômatos. Conceitos Básicos Prof. Anderson Belgamo

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Autómatos de pilha e Gramáticas independentes de contexto

Reduce: reduz o que está imediatamente à esquerda do foco usando uma produção

Lema do Bombeamento para Linguagens Livres do Contexto

Apostila 02. Objetivos: Estudar os autômatos finitos Estudar as expressões regulares Estudar as gramáticas regulares Estudar as linguagens regulares

Análise sintática. Prof. Thiago A. S. Pardo. Análise sintática ascendente

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais

Compiladores Aula 6. Celso Olivete Júnior.

Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Curso de Ciências de Computação

LINGUAGENS FORMAIS Definições. Desenvolveram-se na História em função da necessidade dos grupos humanos que as empregavam

Um alfabeto é um conjunto de símbolos indivisíveis de qualquer natureza. Um alfabeto é geralmente denotado pela letra grega Σ.

Linguagens Formais e Autômatos P. Blauth Menezes

Expressões Regulares e Gramáticas Regulares

LL Parser ( TOP-DOWN)

Vantagens de uma Gramática. Sintaxe de uma Linguagem. Analisador Sintático - Parser. Papel do Analisador Sintático. Tiposde Parsers para Gramáticas

Análise Sintática Bottom-up

Análise sintática. Análise sintática ascendente. Parte-se dos símbolos terminais em direção ao símbolo inicial da gramática. Derivação mais à direita

Gramáticas Livres de Contexto

Linguagens livres de contexto e autômatos de pilha

Curso de Engenharia de Computação - UTFPR Teoria da Computação - Prof. Celso Kaestner Lista de exercícios

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Tokens, Padroes e Lexemas

Introdução Análise Sintática Descendente Análise Sintática Ascendente. Aula Prática. Fernando Antônio Asevedo Nóbrega

Autómatos de pilha e GIC

Modelos de Computação

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Transformações úteis para GLC: (1) eliminação de produções nulas; (2) eliminação de produções unitárias; (3) Eliminação de símbolos estéreis e

Análise sintática. Questão. E se a análise sintática pudesse ser modelada por autômatos?

Apostila 01 Fundamentação da Teoria da Computação e Linguagens Formais

INE5317 Linguagens Formais e Compiladores. Ricardo Azambuja Silveira INE-CTC-UFSC URL:

Análise Sintática II: Analisadores Descendentes Preditivos

SCC 205 Teoria da Computação e Linguagens Formais

Universidade Federal de Alfenas

Transcrição:

INE5317 Linguagens Formais e Compiladores AULA 9: Propriedades e Reconhecimento das Linguagens Livres do Contexto baseado em material produzido pelo prof Paulo Bauth Menezes e pelo prof Olinto José Varela Furtado Ricardo Azambuja Silveira INE-CTC-UFSC E-Mail: silveira@inf.ufsc.br URL: www.inf.ufsc.br/~silveira

A Classe das LLC Mais geral que a das Regulares, mas ainda é relativamente restrita linguagens que não são LLC: Palavra duplicada { ww w é palavra sobre { a, b } } Triplo balanceamento { an b n c n n 0 } importante limitação das LLC usando Autômato com Pilha é possível intuir por que não são LLC

Questões sobre as LLC Como determinar se uma linguagem é LLC? O conjunto das LLC é fechado para operações união? intersecção? concatenação? complemento? Como verificar se uma LLC é infinita Finita vazia

Questões sobre as LLC Algumas questões não possuem solução computacional: não existe algoritmo capaz de analisar duas LLC quaisquer e concluir se são iguais ou diferentes Uma palavra pertence ou não a uma linguagem? Algoritmos de reconhecimento válidos para qualquer linguagem da classe quantidade de recursos de tempo e espaço que o algoritmo necessita

Algoritmos construídos a partir de uma GLC Autômato com Pilha Descendente Algoritmo de Cocke-Younger-Kasami Algoritmo de Early Reconhecedores que usam autômato com pilha: muito simples em geral, ineficientes tempo de processamento é proporcional a k w w palavra de entrada k depende do autômato Algoritmos mais eficientes não baseados em AP tempo de processamento proporcional a w 3 ou até menos

Propriedades das LLC Investigação se é LLC usar os formalismos livre do contexto Gramática Livre do Contexto Autômato com Pilha Demonstração de que não é LLC realizada caso a caso usando o Lema do Bombeamento para as LLC

Bombeamento para as LLC Se L é uma LLC, então existe uma constante n tal que : para qualquer palavra w L onde w n, w pode ser definida como w = u x v y z x v y n, x y 1 para todo i 0, u x i v y i z é palavra de L Usando gramáticas na Forma Normal de Chomsky se a gramática possui s variáveis, pode-se assumir que n = 2 s

Bombeamento para as LLC Para w = u x v y z tal que x y 1 em que x ou y pode ser a palavra vazia (mas não ambas) resulta em bombeamentos não balanceados ( linguagens regulares) o duplo bombeamento balanceado é uma importante característica das LLC duplo balanceamento: { an b n n 0 } palavra e sua reversa \: { ww r w pertence a { a, b }* }

Bombeamento para as LLC Linguagens regulares são capazes de expressar apenas bombeamentos sem qualquer balanceamento Linguagens livres do contexto são capazes de expressar bombeamentos balanceados dois a dois Linguagens livres do contexto não são capazes de expressar triplo bombeamento balanceado

Exemplo Triplo Balanceamento - L = { a n b n c n n 0 } Pelo bombeamento, w pode ser definida como w = u x v y z x v y r x y 1 para todo i 0, u x i v y i z é palavra de L O que não ocorre x y jamais possuirá ocorrências de a, b e c simultaneamente. a aplicação do bombeamento pode desbalancear as ocorrências de a, b e c

Operações Fechadas sobre as LLC Operações sobre linguagens podem ser usadas para construir novas linguagens a partir de linguagens conhecidas definindo-se uma álgebra provar propriedades construir algoritmos Classe das LLC União concatenação intersecção complemento

União Operações Fechadas sobre as LLC Concatenação Prova: União: (direta) AP + não-determinismo Suponha L 1 e L 2, LLC. Então, existem AP M1 = (Σ 1, Q 1, δ 1, q0 1, F 1, V 1 ) e M 2 = (Σ 2, Q 2, δ 2, q0 2, F 2, V 2 ) tais que ACEITA(M 1 ) = L 1 e ACEITA(M 2 ) = L 2

Operações Fechadas sobre as LLC Seja M 3 (suponha que Q 1 Q 2 { q 0 } = e V V = ) 1 2 M 3 = (Σ 1 Σ 2, Q 1 Q { q0 }, δ, q0, F F, V V ) 2 3 1 2 1 2 Claramente, M 3 reconhece L 1 L 2

Operações Fechadas sobre as LLC Concatenação Suponha L 1 e L 2, LLC. Então, existem GLC G 1 = (V 1, T 1, P 1, S 1 ) e G 2 = (V 2, T 2, P 2, S 2 ) tais que GERA(G 1 ) = L 1 e GERA(G 2 ) = L 2 Seja G 3 (suponha que V 1 V 2 { S } = ) G 3 = (V 1 V 2 { S }, T T, P P { S S S 1 2 1 2 1 2 }, S) Claramente qualquer palavra gerada por G 3 terá, como prefixo, uma palavra de L 1 e como sufixo, uma palavra de L 2, Logo, L 1 L 2 é LLC

Operações Fechadas sobre as LLC a Classe das LLC não é fechada para intersecção complemento Contradição: se L é LLC, existe AP M tal que ACEITA(M) = L e REJEITA(M) = ~L, ou seja: rejeita qualquer palavra que não pertença a L se L é LLC, não se pode afirmar que ~L também é LLC

Operações Fechadas sobre as LLC Assim, é possível um AP rejeitar o complemento de uma LLC, embora nem sempre seja possível aceitar o complemento Explicação intuitiva: um AP aceita uma LLC se pelo menos um dos caminhos alternativos aceita

Operações Fechadas sobre as LLC Invertendo aceita/rejeita, a situação continua sendo de aceitação

Prova: Operações Fechadas sobre as LLC Intersecção: (direta) contra-exemplo Sejam LLC L 1 = { a n b n c m n 0 e m 0 } e L 2 = { a m b n c n n 0 e m 0 } Intersecção de L 1 com L 2, não é LLC L 3 = { a n b n c n n 0 }

Operações Fechadas sobre as LLC Complemento: Conseqüência direta Intersecção pode ser representada em termos da união e do complemento Classe das LLC não é fechada para a operação de intersecção como é fechada para a união não se pode afirmar que é fechada para o complemento

Investigação se é Vazia, Finita ou Infinita Suponha L LLC Vazia: Seja G = (V, T, P, S), GLC tal que GERA(G) = L Seja G SI = (V SI, T SI, P SI, S) equivalente a G excluindo os símbolos inúteis Se P SI for vazio, então L é vazia

Investigação se é Vazia, Finita ou Infinita Finita e Infinita: Seja G = (V, T, P, S) GLC tal que GERA(G) = L Seja GFNC = (VFNC, TFNC, PFNC, S) equivalente na FN de Chomsky Se existe A variável tal que A BC (A no lado esquerdo) X YA ou X AY (A no lado direito) existe um ciclo em A: A + α A β Logo A é capaz de gerar palavras de qualquer tamanho e L é infinita Caso não exista tal A, então L é finita

Algoritmos de reconhecimento Podem ser classificados como Top-Down ou Preditivo constrói uma árvore de derivação a partir da raiz (símbolo inicial da gramática) com ramos em direção às folhas (terminais) Bottom-Up oposto do top-down: parte das folhas construindo a árvore de derivação em direção à raiz

Autômato com Pilha como Reconhecedor construção relativamente simples e imediata relação quase direta entre produções e as transições do AP algoritmos top-down simula derivação mais à esquerda não-determinismo: produções alternativas da gramática

Autômato com Pilha como Reconhecedor a partir de uma Gramática na Forma Normal de Greibach cada produção gera exatamente um terminal geração de w: w etapas de derivação cada variável: pode ter diversas produções associadas AP testa as diversas alternativas número de passos para reconhecer w: proporcional a k w aproximação de k: metade da média de produções das variáveis portanto, o AP construído tempo de reconhecimento proporcional ao expoente em w pode ser muito ineficiente para entradas mais longas

Autômato com Pilha Descendente forma alternativa de construir AP, igualmente simples e com o mesmo nível de eficiência, a partir de uma GLC sem recursão à esquerda simula a derivação mais à esquerda Algoritmo: inicialmente, empilha o símbolo inicial topo = variável: substitui, (não-determinismo), por todas as produções da variável topo = terminal: testa se é igual ao próximo símbolo da entrada

Autômato com Pilha Descendente GLC G = (V, T, P, S), sem recursão à esquerda M = (T, { q0, q1, qf }, δ, q0, { qf }, V T) δ(q0, ε, ε) = { (q1, S) } δ(q1, ε, A) = { (q1, α) A α P } A de V δ(q1, a, a) = { (q1, ε) } a de T δ(q1,?,?) = { (qf, ε) }

Exemplo AP Descendente: Duplo Balanceamento L = { a n b n n 1 } G = ({ S }, { a, b }, P, S) GLC sem recursão à esquerda P = { S asb ab } Autômato com pilha descendente M = ({ a, b }, { q0, q1, qf }, δ, q0, { qf }, { S, a, b })

Análise Sintática (Parsing) É realizada pelo Analisador Sintático ou Parser; O parser é um algoritmo que, recebendo como entrada uma cadeia α, emite como saída: Aceitação de α, se α pertence à linguagem, ou ERRO, se α não pertence à linguagem.

Análise Sintática (Parsing) Análise sintática (parse) top-down: é uma análise onde se procura, a partir do símbolo de partida da gramática, chegar à cadeia que está sendo analisada progredindo nas regras de produção; Esta análise equivale à seqüência dos números das regras de produção utilizadas S α através de derivações mais à esquerda.

Análise Sintática (Parsing) Análise sintática (parse) bottom-up: é uma análise onde se procura, a partir da cadeia que está sendo analisada, chegar ao símbolo inicial da gramática regredindo nas regras de produção; Esta análise equivale à seqüência invertida dos números das regras de produção utilizadas S α através de derivações mais à direita.

Análise Sintática (Parsing) Analisadores Sintáticos Descendente (Top-down) Ascendente (Bottom-up) Com retrocesso (back track) Sem retrocesso (preditive)

Análise Sintática (Parsing) Análise sintática descendente: Com retrocesso (back track): Quando a gramática permite, em um determinado estágio da derivação, a aplicação de mais de uma regra. Isto acontece quando o mesmo símbolo terminal aparece no início do lado direito de mais de uma regra de produção. Exemplo: A aα A aβ Onde: α, β (V N V T ) * A V N a V T

Análise Sintática (Parsing) Análise sintática descendente: Sem retrocesso (preditive): Quando a gramática só permite um caminho a ser derivado. Desta forma, olhando apenas para o próximo símbolo de entrada podemos determinar a próxima derivação. Requisitos: Durante o processo de derivação, sempre haverá uma única regra que possa levar a cadeia que está sendo analisada. Não pode haver recursão à esquerda. Exemplo: A Aα Onde α (V N V T ) * e A V N

Análise Sintática (Parsing) Preditive parser recursivo: É executado um conjunto de procedimentos recursivos para processar a entrada. A cada não terminal é associado um procedimento; Existe também um procedimento adicional para o reconhecimento dos símbolos (tokens); Vantagens: Simplicidade; Desvantages: Maior tempo de processamento; Não é geral; Existem linguagens que não aceitam recursividade.

Análise Sintática (Parsing) Cálculo do first: o cálculo do first (ou primeiro) é fundamental para verificar se a partir de um mesmo símbolo terminal existem duas possibilidades de derivação que produzam um mesmo símbolo terminal mais à esquerda (na primeira posição). First(A) (ou Primeiro(A)) é o conjunto de tokens (símbolos) que figuram como primeiro elemento de uma ou mais cadeias geradas a partir de A.

Análise Sintática (Parsing) Exemplo 1: S AS BA A ab C B ba d C c First(S) = First(A) First(B) = {a, c, b, d} First(A) = {a, c} First(B) = {b, d} First(C) = {c}

Análise Sintática (Parsing) Exemplo 2: S ABC λ A aa λ B bb ACd C cc λ First(S) = {a, c, b, d, λ} First(A) = {a, λ} First(B) = {b, a, c, d,λ} First(C) = {c, λ}

Análise Sintática (Parsing) Só se pode aplicar o analisador preditivo recursivo em uma gramática se para todas as regras do tipo A α, A β,...(onde α, β (V N V T ) * ), os conjuntos First(α) e First(β) forem disjuntos.

Algoritmo de Early possivelmente o mais rápido algoritmo para LLC tempo de processamento proporcional a em geral: w 3 gramáticas não-ambíguas: w 2 muitas gramáticas de interesse prático: w

Algoritmo de Early Algoritmo top-down a partir de uma GLC sem produções vazias parte do símbolo inicial executa sempre a derivação mais à esquerda cada ciclo gera um terminal comparado com o símbolo da entrada sucesso -> construção do conjunto de produções que, potencialmente, pode gerar o próximo símbolo

Algoritmo de Early Seja G = (V, T, P, S) uma GLC sem produções vazias w = a 1 a 2 a n palavra a ser verificada marcador " antecedendo a posição, em cada produção, que será analisada na tentativa de gerar o próximo símbolo terminal sufixo "/u" adicionado a cada produção indica o u-ésimo ciclo em que passou a ser considerada

Algoritmo de Early Etapa 1: construção de D 0 : primeiro conjunto de produções D 0 = (1)produções que partem de S (2)produções que podem ser aplicadas em sucessivas derivações mais à esquerda (a partir de S) para toda S α P (1) faça D 0 = D 0 { S α/0 } repita para toda A Bβ/0 D0 (2) faça para toda B φ P faça D 0 = D 0 { B φ/0 } até que o cardinal de D 0 não aumente

Algoritmo de Early Etapa 2: construção dos demais conjuntos de produção n = w conjuntos de produção a partir de D 0 ao gerar a r, constrói D r : produções que podem gerar a r+1 para r variando de 1 até n (1) faça Dr = ; para toda A α arβ/s Dr-1 (2) faça Dr = Dr { A αar β/s }; repita para toda A α Bβ/s Dr (3) faça para toda B φ P faça Dr = Dr { B φ/r } para toda A α /s de Dr (4) faça para toda B β Aφ/k Ds faça Dr = Dr { B βa φ/k } até que o cardinal de Dr não aumente

Algoritmo de Early (1) cada ciclo gera um conjunto de produções Dr (2) gera o símbolo ar (3) produções que podem derivar o próximo símbolo (4) uma subpalavra de w foi reduzida à variável A inclui em Dr todas as produções de Ds que referenciaram A;

Algoritmo de Early Etapa 3: condição de aceitação da entrada. uma produção da forma S α /0 pertence a Dn w foi aceita S α /0 é uma produção que parte do símbolo inicial S foi incluída em D0 ("/0") todo o lado direito da produção foi analisado com sucesso (" " está no final de α) Otimização do Algoritmo de Early ciclos repita-até podem ser restritos exclusivamente às produções recentemente incluídas em Dr ou em D0 ainda não-analisadas.

Exemplo "Expressão simples" da linguagem Pascal G = ({ E, T, F }, { +,, [, ], x }, P, E), na qual: P = { E T E+T, T F T F, F [E] x } Reconhecimento da palavra x x D0: E T/0 produções que partem E E+T/0 do símbolo inicial T F/0 produções que podem ser aplicadas T T F/0 em derivação mais à esquerda F [E]/0 a partir do símbolo inicial F x/0

Exemplo D1: reconhecimento de x em x x F x /0 x foi reduzido a F T F /0 inclui todas as produções de D0 que T T F/0 referenciaram F direta ou indiretamente E T /0 movendo o marcador " " E E +T/0 um símbolo para a direita D2: reconhecimento de em x x T T F/0 gerou ; o próximo será gerado por F F [E]/2 inclui todas as produções de P que F x/2 podem gerar o próximo terminal a partir de F

Exemplo D3: reconhecimento de x em x x F x /2 x foi reduzido à F T T F /0 incluído de D2 (pois F x /2); entrada reduzida à T E T /0 incluído de D0 (pois T T*F /0); entrada reduzida à E T T F/0 incluído de D0 (pois T T F /0) E E +T/0 incluído de D0 (pois E T /0) Como w = x x foi reduzida a E e como E T /0 pertence a D3 entrada aceita

Algoritmo de Cocke-Younger- Kasami a partir de uma GLC na Forma Normal de Chomsky gera bottom-up todas as árvores de derivação da entrada w tempo de processamento proporcional a w 3 idéia básica tabela triangular de derivação célula: raízes que podem gerar a correspondente sub-árvore

Algoritmo de Cocke-Younger- Kasami Seja G = (V, T, P, S) uma GLC na Forma Normal de Chomsky w = a 1 a 2 a n uma entrada entrada V rs células da tabela

Algoritmo de CYK Etapa 1: variáveis que geram diretamente terminais ( A a) para r variando de 1 até n faça V r1 = { A A a r P } Etapa 2: produções que geram duas variáveis ( A BC) para s variando de 2 até n faça para r variando de 1 até n - s + 1 faça Vrs = para k variando de 1 até s - 1 faça Vrs = Vrs { A A BC P, B Vrk e C V(r+k)(s-k) } limite de iteração para r é (n - s + 1): a tabela é triangular Vrk e V(r+k)(s-k) são as raízes das sub-árvores de Vrs célula vazia: não gera qualquer sub-árvore Etapa 3: condição de aceitação da entrada. símbolo inicial pertence à V1n (raiz de toda palavra) aceita

G = ({ S, A }, { a, b }, P, S) Exemplo P = { S AA AS b, A SA AS a }

Solução

Solução

Solução