IF688 – Análise Sintática. Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up.

Slides:



Advertisements
Apresentações semelhantes
Software Básico Silvio Fernandes
Advertisements

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
III – Análise sintáctica Parsers ascendentes Instruções shift-reduce Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.5 LFA 1999/ Jorge.
III – Análise sintáctica
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 ­
Compiladores Prof. Yandre Maldonado Compiladores - Prof. Yandre - 1.
Profa. Heloise Manica Paris Teixeira
Análise Sintática - Continuação
Linguagens Livres de Contexto
Análise Sintática Ascendente
Relações em uma Gramática
Construção de Compiladores
Construção de Compiladores
Construção de Compiladores
Análise léxica e sintática
Compiladores, Aula Nº 19 João M. P. Cardoso
Aula 17 1 Análise Sintáctica Compiladores, Aula Nº 17 João M. P. Cardoso.
Teoria e Implementação de Linguagens Computacionais
Análises léxica e sintática
Análise Léxica e Sintática
Análise Léxica.
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Esquemas L-atribuídos
Análise Sintática LR Prof. Alexandre Monteiro
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.
Compiladores.
Análise Sintática Prof. Alexandre Monteiro
Tradução Dirigida por Sintaxe
Aula 18 1 Análise Sintáctica Compiladores, Aula Nº 18 João M. P. Cardoso.
Revisão Compiladores – AP2
Análise Sintática de Descida Recursiva
Compiladores Análise Sintática
COMPILADORES 04 Prof. Marcos.
Um Tradutor Dirigido por Sintaxe Simples
Sintaxe de uma Linguagem
PLP – JavaCC Java Compiler Compiler
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
Heaps Katia S. Guimarães
1 CIn / UFPE Algoritmos de Parsing Gustavo Carvalho Março 2011.
1 CIn / UFPE Introdução a Parsing Gustavo Carvalho Abril 2015.
Compiladores - Introdução. O que é um Compilador? “Um compilador é um programa que lê um programa escrito em uma linguagem (linguagem fonte) e a traduz.
Douglas Matheus de Souza Prof. Marcel Hugo, Mestre - Orientador.
Operator-precedence Parser
Estruturas de Repetição
Projeto de Compiladores
Construção de Compiladores
Teoria da Computação Prof. Msc. Ricardo Loiola
Complementos de Engenharia de Software 2005/06
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
FUNDAMENTOS DE PROGRAMAÇÃO
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
COMPILADORES 06 Prof. Marcos.

Análise Sintática Recursiva e Preditiva
Análise Sintática Botton Up Diomara M. R. Barros
Traduções Dirigidas por Sintaxe
CT Fundamentos de Automata e Linguagens Formais
Compiladores – Conceitos Básicos
Ordenação por Comparação
Compiladores – AnáLise léxica
Compiladores, Aula Nº 13 João M. P. Cardoso
Análise Sintática (parte 1) “Pois o salário do pecado é a morte, mas o dom gratuito de Deus é a vida eterna em Cristo Jesus, nosso Senhor.” (Romanos 6:23)
Transcrição da apresentação:

IF688 – Análise Sintática

Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up

Analisador Sintático Programa fonte lexerparser getNextToken() token tabela de símbolos type checker Árvore sintática ou outra representação intermediária de código

Sintaxe de uma linguagem Define as strings estruturalmente válidas de uma linguagem “Fez parsing corretamente” = A sintaxe está correta Note: O programa pode ainda... não passar na checagem de tipos ou (de forma mais geral) conter erros

Especificação da sintaxe Dever ser precisa e fácil de entender Precisa: não ambígua Fácil de entender: deixa evidente a sintaxe da linguagem Historicamente, gramáticas livre de contexto (BNFs) é um formalismo adequado Fácil de especificar/manter/entender S  aABe A  Abc | b B  d Exemplo:

Exercício. Qual das strings a seguir faz parte da liguagem definida pela BNF abaixo? abcba acca aba abcbcba S → aXa X → € | bY Y → € | cXc

Derivação e parsing S  aABe A  Abc | b B  d Gramática G S  aABe  aAbcBe  aAbcbcBe  abbcbcBe  abbcbcde Derivação de string em G S ABae Abc Abc d b Árvore sintática para abbcbcde

Diferenças: Derivação e parsing Derivação: Dada uma gramática G, produz uma string s que faz parte de L(G) Parsing: Dada uma string s em L(G), produz uma árvore sintática que demonstra como se obter derivação de s

Exercício. Qual das seguintes derivações é válida de acordo com a gramática ao lado? S aXa aa S aXa abYa acXca acca S → aXa X → € | bY Y → € | cXc | d S aXa abYa abcXcda abccda S aXa abYa abcXca abcbYcaabc bdca

Top-down e Bottom-up Considerando a ordem de criação da árvore sintática, top-down constrói o nó raiz primeiro e depois os internos em direção aos nós folha. bottom-up faz o contrário.

Top-down parser Procura sequência de derivações mais a esquerda para se obter uma string de entrada O parse da string abbcbcde é caracterizado pela sequência de derivações abaixo. S  aABe A  Abc | b B  d S  aABe  aAbcBe  aAbcbcBe  abbcbcBe  abbcbcde

Top-down parser Procura sequência de derivações mais a esquerda para se obter uma string de entrada O parse da string abbcbcde é caracterizado pela sequência de derivações abaixo. S  aABe A  Abc | b B  d S  aABe  aAbcBe  aAbcbcBe  abbcbcBe  abbcbcde Note a preferência da produção mais à esquerda

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eS

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eaABe

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eABe escolha!

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd ebBebBe

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eBeBe  erro. Backtrack!

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eABe Restaura estado anterior a última escolha Faz outra escolha!

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eAbcBe

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eAbcBe escolha novamente! Símbolo A novamente na posição mais à esquerda

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd ebbcBe Outra escolha!

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd ebcBe

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eBeBe erro. Backtrack! 

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eAbcBe Restaura estado anterior a última escolha

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eAbcbcBe Faz outra escolha!

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd ebbcbcBe

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd eBeBe

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd ede

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd e

O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S  aABe A  Abc | b B  d abbcbcd e derivação correspondente! S  aABe  aAbcBe  aAbcbcBe  abbcbcBe  abbcbcde

Top-down parsers operam desta forma!

Exercício. Construa a árvore sintática associada a derivação (mais à esquerda) abaixo S  aABe A  Abc | b B  d abbcbcd e S  aABe  aAbcBe  aAbcbcBe  abbcbcBe  abbcbcde GramáticaString de entrada Derivação mais à esquerda

Classificação de parsers LL(k) Lê entrada da esquerda (L) para direita Procura derivação mais à esquerda Número de tokens de lookahead lidos porém não consumidos

Ambiguidade e Recursão à esquerda Ambiguidade: Existe mais de uma forma de se derivar a string em uma gramática ambígua Mais de uma parse tree Recursão à esquerda: dificuldade em saber quando parar de aplicar uma produção S  aABe A  Abc | b B  d aABe  aAbcBe  aAbcbcBe  aAbcbcbcBe  aAbcbcbcbcBe  … complicador

Ex: Quais das seguintes gramáticas são ambíguas? S → SS | a | b E → E + E | id S → Sa | Sb | a E → E’ | E’ + E E’ → -E’ | id | (E)

Predictive parsing É um parser top-down É um parser que não requer backtracking Simples de construir manualmente Mas, requer modificação na gramática para tratar recursão à esquerda e ambigüidade Eliminação de recursão à esquerda (fatoração): S  aABe A  Abc | b B  d S  aABe A  bK K  bcK | ∈ B  d

Ex: Escolha a gramática que elimina recursão à esquerda corretamente da seguinte gramática: E → id + E | E + T | T T → id | (E) E → E’ + T | T E’ → id | (E) T → id | (E) E → E + T | T T → id | (E) E → TE’ E’ → +TE’ | € T → id | (E) E → E + id | E + (E) | id | (E)

Pode-se construir parser LL(k=1) para uma gramática não ambígua. Gramáticas ambíguas pedem parsers com valor de k > 1. Existem algoritmos para gerar parsers top-down de gramáticas ambíguas (e também com recursão à esquerda). Resultados gerais

Bottom-up parser Procura sequência de derivações mais a direita para se obter uma string de entrada O parse da string abbcbcde é caracterizado pela sequência de derivações abaixo. S  aABe A  Abc | b B  d Animação S  aABe  aAde  aAbcde  aAbcbcde  abbcbcde

O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S  aABe A  Abc | b B  d abbcbcd e

O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S  aABe A  Abc | b B  d abbcbcd e A

O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S  aABe A  Abc | b B  d abbcbcd e A

O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S  aABe A  Abc | b B  d abbcbcd e AB

O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S  aABe A  Abc | b B  d abbcbcd e S S  aABe  aAde  aAbcde  aAbcbcde  abbcbcde derivação correspondente!

Shift-reduce parsers Usa uma pilha e uma tabela Pilha: armazena tokens para salvar contexto Tabela: determina as opções atuais de ação Possíveis ações Shift (push): coloca tokens na pilha Reduce: determina uma produção Accept: finaliza. reconhece string. Error: Nenhuma ação é possível

LR(k) Lê entrada da esquerda (L) para direita Procura a derivação mais à direita Número de tokens de lookahead lidos porém não consumidos Bottom-up parsers operam desta forma! Terminologia: classificação de parsers

Comparação Top-down e Bottom-up Em geral, bottom-up é mais poderoso Coloca menos restrições na gramática Bem mais trabalhoso de se escrever e manter manualmente. Porém... Yacc e Bison geram parser de gramática LALR(1), um subconjunto LR(1)

Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up