Análise Sintática Ascendente

Slides:



Advertisements
Apresentações semelhantes
FAPE - Curso de Ciência da Computação
Advertisements

Software Básico Silvio Fernandes
5.5 – Análise Bottom-Up Tentativa de construir uma árvore sintática para a sentença analisada, começando das folhas, indo em direção à raiz (pós-ordem.
III – Análise sintáctica
III – Análise sintáctica Parsers ascendentes Instruções shift-reduce Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.5 LFA 1999/ Jorge.
I - Noções dum compilador
III – Análise sintáctica
Teoria da Computação FIC– Ciência da Computação
Compiladores FIC– Ciência da Computação Professor: Ciro Meneses Santos
Deyvisson, Rafael M.P., Renato, Robson C.F., Rodolfo
Análise Sintática Ascendente ­
Software Básico Silvio Fernandes
Compiladores Prof. Yandre Maldonado Compiladores - Prof. Yandre - 1.
Prof. Heloise Manica Paris Teixeira
Profa. Heloise Manica Paris Teixeira
Análise Sintática - Continuação
Análise Sintática - Continuação
Algoritmos e Programação Estruturada Conceitos básicos
Árvores.
Linguagens Livre de Contexto
Busca Cega (Exaustiva)
Métodos de Classificação por Seleção: HeapSort
Curso Sistemas de Informação Disciplina: Arquitetura de Software
Relações em uma Gramática
Linguagem de Prog. e Programas
Análise Léxica Supondo o trecho de programa abaixo:
Construção de Compiladores
Construção de Compiladores
Construção de Compiladores
Buscas em Grafos Prof. André Renato 1º Semestre/2012
T ÓPICOS DE I.A. Métodos de Busca Busca em Espaços de Estado Prof. Mário Dantas.
Lema do Bombeamento Linguagens Livres de Contexto
Análise léxica e sintática
Compiladores, Aula Nº 19 João M. P. Cardoso
Compiladores, Aula Nº 9 João M. P. Cardoso
Gramáticas Livres de Contexto
Capítulo 11 Programação Lógica
Teoria e Implementação de Linguagens Computacionais
Introdução e Busca Cega
Introdução aos Agentes Inteligentes Busca Cega (Exaustiva)
Análises léxica e sintática
Análise Léxica e Sintática
Expressões Regulares e Gramáticas
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Esquemas L-atribuídos
Análises léxica e sintática
Projeto de Tradutor Preditivo. Introdução Introdução Esquemas L-atribuidos são reconhecidos por analisadores Top-Down. Entre estes analisadores, se encontra.
Aula 12 1 Análise Sintáctica Compiladores, Aula Nº 12 João M. P. Cardoso.
Compiladores.
Análise Sintática Prof. Alexandre Monteiro
Tradução Dirigida por Sintaxe

Aula 06 – 05/04 Árvores binárias.
Aula 18 1 Análise Sintáctica Compiladores, Aula Nº 18 João M. P. Cardoso.
Mas para que serve um analisador sintático? Verificar se a estrutura gramatical do programa está correta Escrito de outra forma: O texto segue as regras.

Compiladores Análise Sintática
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.

Principais Tópicos Introdução Métodos de busca Busca cega
Sintaxe de uma Linguagem
tópicostópicos itens 01. Terminologia 02. Operações básicas 03. Representação de linguagens 04. Formalização de gramáticas 05. Processo de derivação 06.
Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – Rodrigo Diego Melo Amorim–
Analisador sintático: Tipos de análises sintáticas
Andréa Iabrudi 1 Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I.
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Informática Teórica Engenharia da Computação. Teoria da Computação Contexto do que vamos começar a estudar As linguagens também podem ser definidas formalmente.
Transcrição da apresentação:

Análise Sintática Ascendente O Algoritmo inicia a leitura do programa fonte, da esquerda para a direita, varre as diferentes hipóteses e obtém a árvore de derivação. É claro que a cadeia só é reconhecida quando atinge-se o símbolo inicial da gramática. Algoritmo: 1. Adotar a cadeia dada como valor inicial de a 2. Procura-se decompor a de forma que a = bX1X2...Xng, existindo uma produção da forma X = X1X2...Xn, chegamos a = bXg. O significado é associar ao não terminal X e as subárvores são as ocorrências de X1X2...Xn, que foram substituídas. Se Xi é um terminal, a árvore associada será uma folha de rótulo Xi. 3. Repete-se o passo anterior até que a seja o símbolo inicial da gramática.

Análise Sintática Ascendente Exemplo: Seja a gramática de Expresssões, anteriormente definida: 1. E  T 2. | E + T 3. |T Supondo a cadeia a + b * a, teríamos que aplicar reduções até obter a cadeia de entrada. 4. T  F 5. | T * F 6. F  a 7. | b 8. | (E)

Análise Sintática Ascendente Observações: Procuramos as reduções mais à esquerda, obtém-se as derivações mais à direita que formam a cadeia; Nem sempre as reduções são triviais e levam à uma sequência válida; Considerando o item anterior, o algoritmo deveria varrer todas as hipóteses possíveis, retrocedendo, se necessário. O algoritmo ideal sabe qual redução escolher - aplicável a um número menor de gramáticas.

Análise Sintática Ascendente Problemas da Análise Ascendente:  identificação da parte a a ser reduzida;  identificação da produção a ser associada adequadamente à redução. Assim, em uma gramática onde existam produções do tipo A  b B  b, o programa tem de saber qual produção deve ser aplicada para redução  há algoritmos que usam o mecanismo de redução diferente.

Análise Sintática Descendente Princípios Básicos: - Parte-se do axioma da gramática, para chegar à sentença a ser verificada: se esta sentença estiver correta do ponto de vista gramatical, ela é reconhecida; - Eqüivale à construir a árvore de derivação para a sentença, a partir da raiz e obter nas folhas os símbolos da sentença; - Quando as folhas representam os símbolos terminais relativos à cadeia de entrada, a mesma foi reconhecida. No curso: - Análise Descendente com Retrocesso - Análise Descendente Recursiva - Análise LL(k)

Análise Descendente com Retrocesso Um dos primeiros métodos para Análise Sintática  Apresenta grandes ineficiências quanto à utilização de memória e tempo O processo é tipicamente exploratório: tenta-se a derivação mais à esquerda para obter uma dada cadeia de entrada, através da exploração: no caso de haver várias regras com o mesmo lado esquerdo e diferentes lados direitos, ele escolhe uma e continua a análise; caso tenha escolhido mal, ele seleciona outra possibilidade e continua o processo O processo termina quando não existem mais alternativas ou quando a cadeia foi reconhecida.

Análise Descendente com Retrocesso Suponhamos a gramática dada por G = (Vn, Vt, {S}, P) onde Vn = {S, A, B}, Vt = {a, b, c, d}, onde P é dado por: 1 - S -> A 2 - A -> a 3 - A -> aB Quais seriam as tentativas executadas pelo parser para reconhecer a cadeia abcd ? Obs: a partir do exemplo, observa-se que o problema passa a ser como fazer para evitar retrocessos na análise: conhecido o próximo símbolo da cadeia e qual o não terminal a ser derivado, determinar exatamente qual regra da Gramática deve ser aplicada. 4 - B -> bB 5 - B -> cB 6 - B -> d

Análise Descendente com Retrocesso Suponhamos a gramática dada por G = (Vn, Vt, {S}, P) onde Vn = {S, A}, Vt = {a, b, c, d}, onde P é dado por: 1 - S -> cAd 2 - A -> ab 3 - A -> a O processo de construção top-down para a cadeia ‘cad’ seria: - fazemos S como nossa árvore inicial, c é o primeiro símbolo de a - usando a primeira produção possível para S obtém-se a árvore: S c A d

Análise Descendente com Retrocesso Como c corresponde ao primeiro símbolo de a, então, uma posição é avançada, ficando o ponteiro apontando para ‘a’, e o não terminal ‘A’. A tentativa abaixo pode ser efetuada: S c A d a b Agora, na leitura do próximo símbolo ‘d’ não há reconhecimento, deve-se voltar ao símbolo A e tentar nova regra de produção que permita o reconhecimento, e assim, sucessivamente.

Análise Descendente com Retrocesso Observações: - possibilidade de loop infinito para produções com recursão à esquerda - backtracking: uma seqüência de expressões errôneas, capaz de gerar uma má cadeia, leva a uma nova tentativa e à perda do efeito semântico da tentativa errada; - a ordem das substituições podem afetar a aceitação da cadeia, por exemplo, no caso anterior, se tivéssemos tentado expandir A para a e reconhecido A, o parser falharia na tentativa de reconhecimento.

Análise Descendente Recursiva Precisamos saber, dado o símbolo de entrada a e o não terminal A a ser expandido, qual das alternativas da produção A  a1| a2| ... |an é a única alternativa que deriva uma cadeia começando por a Se uma alternativa de A é l, e nenhuma das outras alternativas deriva da cadeia começando com a, então podemos expandir A  l aceitando a entrada a. O parser recursivo descendente é um conjunto de procedimentos recursivos, um para cada não terminal a ser derivado.

Análise Descendente Recursiva Restrições a este tipo de análise: - gramáticas não recursivas à esquerda, com produções A Aa; - não possuindo mais que um lado direito de um não terminal começando por um mesmo terminal; Exemplo: < programa> := <declarações> <bloco> . procedure programa; begin declarações; bloco; lexico(x); if (x = ‘.’) then write (“Programa Sintaticamente Correto”; else write (“Erro de Sintaxe”); end.

Análise Descendente Recursiva - Implementação Método: Diagrama Sintático -> Procedimento Conseqüência: 1 Gramática -> 1 Programa Não-terminal -> Grafo -> Procedimento Exemplo: Seja a gramática dada por: S -> aAd A -> cA | eB B -> f | g