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)

Slides:



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

Análise Sintática - Continuação
Análise Sintática Ascendente
Relações em uma Gramática
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Análise Sintática Prof. Alexandre Monteiro
Faculdade Pernambucana - FAPE Setembro/2007
Sintaxe de uma Linguagem
Analisador sintático: Tipos de análises sintáticas
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
IF688 – Análise Sintática. Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up.
Introdução à Informática com Software Livre 12:58.
Compiladores - Introdução. O que é um Compilador? “Um compilador é um programa que lê um programa escrito em uma linguagem (linguagem fonte) e a traduz.
REPRESENTAÇÕES DE LINGUAGENS Adorilson Bezerra Santa Cruz - RN UNIVERSIDADE DO ESTADO DO RIO GRANDE DO NORTE CAMPUS AVANÇADO DO NATAL DEPARTAMENTO DE CIÊNCIA.
Gerador de aplicativos Oracle PL/SQL WEB baseado na estrutura das tabelas do banco de dados Oracle Wagner da Silva Orientando Prof. Alexander Roberto Valdameri.
Reconhecimento de Padrões Métodos Sintático e Estrutural Disciplina: Tópicos em Inteligência Artificial Prof. Josué Castro.
ESPECIFICAÇÃO DE PROCESSOS PALESTRANTE, MÊS ANO. HOJE FALAREMOS SOBRE 1.OBJETIVO 2.DIRETRIZES DO DESENHO 3.NOTAÇÕES DO DESENHO 4.PADRÃO DE NUMERAÇÃO 5.EXEMPLO.
Ambiente Virtual de Avaliações Utilizando Certificados Digitais Fernando Gevard – Acadêmico Paulo Fernando da Silva - Orientador.
CONTAGEM Princípios Básicos Permutações Arranjos Combinações.
Douglas Matheus de Souza Prof. Marcel Hugo, Mestre - Orientador.
Aula 3 - Estruturas de Repetição
Gerência de Arquivos.
Operator-precedence Parser
PROFESSOR: ALEXSANDRO DE sOUSA
Casamento de Padrão Aproximado e Compressão de Huffaman
Estruturas de Dados Aula 2: Estruturas Estáticas
Teoria dos Grafos Geração de Valores aleatórios
Projeto de Compiladores
Tuplas CHRISTOPHER FREIRE SOUZA EWERTON AMORIM DE OLIVEIRA
Construção de Compiladores
Teoria da Computação Prof. Msc. Ricardo Loiola
Criação: Caroline Brasileiro Atualização: Laura Matos
INSTITUTO FEDERAL DO CEARÁ Mauro Oliveira
CRENDO CONTRA A ESPERANÇA
Modelo de Carta formal e informal com exemplos. Formal e Informal.
GERAÇÃO DE CÓDIGO PARA A MÁQUINA VIRTUAL DE RÓTULOS
Módulo I Capítulo 2: IDE e Variáveis
PROGRAMAÇÃO ORIENTADA A OBJETO - JAVA
Prof. Wellington Franco Sub-Rotinas:Funções e Procedimentos
3.1 Classes e Objetos Em um programa orientado a objetos normalmente existem vários objetos de um mesmo tipo. Por exemplo, um programa de controle de.
Complementos de Engenharia de Software 2005/06
FUNDAMENTOS DE PROGRAMAÇÃO
FUNDAMENTO DE PROGRAMAÇÃO
Sistemas de Numeração O número é um conceito abstrato que representa a idéia de quantidade. Sistema de numeração é o conjunto de símbolos utilizados para.
CODIFICAÇÃO E CATEGORIZAÇÃO
Algoritmos e Técnicas CEFET/RN.
Modelagem de Sistemas I Aula 1 – Introdução à UML
Aula 5 Projeto Olimpíada.
COMPILADORES 06 Prof. Marcos.

Análise Sintática Recursiva e Preditiva
Teoria dos Conjuntos.
Análise Sintática Botton Up Diomara M. R. Barros
3. Sintaxe e Semântica.
Aula 22 Modularização 22/10/08.
Números inteiros juliana
Linguagem de Programação
Traduções Dirigidas por Sintaxe
MER – Modelo de Entidade Relacionamento
LÓGICA DE PROGRAMAÇÃO Estruturas de Decisão
MODELANDO SISTEMAS LTI NO DOMÍNIO DA FREQUÊNCIA.
CT Fundamentos de Automata e Linguagens Formais
Curso básico de PHP. 1 Vantagens: Gratuito Multiplataforma Estável Rapidez Comunicação.
MODELANDO SISTEMAS LTI NO DOMÍNIO DA FREQUÊNCIA.
Sistemas Inteligentes Busca Cega (Exaustiva)
Diêgo Santiago, Leila Soriano e Patrícia Lustosa
Compiladores – Conceitos Básicos
Compiladores, Aula Nº 13 João M. P. Cardoso
Transcrição da apresentação:

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)

Etapas da Compilação Front-End (Análise) Back-End (Síntese) Análise Léxica Análise Sintática Analise Semântica Geração de Código Intermediário Geração de Código Final

Análise Sintática Alguns autores consideram que análise sintática se refere a tudo que diz respeito à verificação do formato do código fonte  Inclui a análise léxica como subfase  Visão mais coerente, porém o livro que usamos tem outra visão...

Análise Sintática Entenderemos análise sintática como sendo apenas a segunda fase dessa verificação de formato:  Fase que analisa a seqüência de tokens para descobrir a “estrutura gramatical” do código fonte  Também chamada “Reconhecimento” (Parsing)  Nome melhor: “Análise Gramatical” ?

Sumário da Aula Gramáticas Livres de Contexto Introdução à Análise Sintática

Gramáticas Livres de Contexto

Gramáticas São usadas para organizar os tokens em “sequências de tokens”  Análogas a “frases” Definem regras de formação recursivas expressão → CTE_INT | ID | expressão + expressão

Gramáticas As gramáticas livres de contexto possuem quatro elementos:  Símbolos terminais  Símbolos não-terminais  Símbolo inicial  Produções !

Gramáticas Elementos das gramáticas livres de contexto:  Símbolos terminais: Símbolos assumidos como atômicos, indivisíveis Em compiladores, são os tokens  Símbolos não-terminais: Usados para organizar os tokens em “frases” Representam elementos abstratos do programa

Gramáticas Elementos das gramáticas livres de contexto:  Símbolo inicial: Não-terminal a partir do qual são derivadas “cadeias” de símbolos terminais Geralmente é um não-terminal chamado programa  Produções: São as regras de formação Definem as “frases” de terminais válidas na linguagem

Notações Notação comum nos livros de Teoria da Computação  Símbolo não-terminal: letras maiúscula  Símbolo terminal: letras minúsculas, sinais, etc. E → T | T + E T → x | i

Notações Notação BNF (Backus-Naur Form)  Símbolo não-terminal delimitado por “ ” ::= | "+" ::= "x" | "i"

Notações Notações EBNF (extended BNF)  Nome genérico – existem várias!  Não-terminais sem delimitadores  BNF + operadores de expressões regulares expressão = termo {"+" termo}* termo = "x" | "i"

Notações Notações que usaremos  Tradicional: para mostrar conceitos mais teóricos  EBNF: para os exemplos práticos Tokens aparecerão literalmente se forem simples (ex.: sinais, palavras-chave, etc.) Tokens com várias opções de casamento aparecerão em maiúscula (ex.: identificadores, valores literais)

Gramáticas No estudo de Teoria da Computação, a gramática podem ser chamada de formalismo gerador A partir do símbolo inicial, podemos derivar (gerar) as cadeias (sequências) de terminais que são válidas na linguagem

Derivação O processo de derivação consiste em substituir cada ocorrência de um não-terminal pelo lado direito (corpo) de alguma de suas produções  Derivação mais à esquerda: o não-terminal a ser substituído é sempre o mais à esquerda  Derivação mais à direita: análogo A derivação pára quando sobrarem apenas terminais  A cadeia resultante fica nas folhas

Derivação Seja a gramática BNF anterior  Derivar a cadeia “i+i+x”  Esta é uma derivação mais à esquerda  +  i +  i + +  i + i +  i + i + x

Derivação Seja a gramática BNF mostrada antes  Derivação mais à direita da cadeia “i+i+x”  +  + +  + + x  + i + x  i + i + x

Árvore de Derivação A árvore dos exemplos anteriores expressão i + i + x termo expressão a cadeia gerada pode ser percebida nas folhas, analisando- as da esquerda para a direita termo

Árvore de Derivação A mesma árvore reorganizada expressão i+i+x termo expressão a seqüência de terminais (cadeia) gerada termo

Árvore de Derivação Mostra de maneira estática as produções aplicadas  Não diferencia se foi uma derivação mais à esquerda ou mais à direita que gerou a cadeia Forma  Tem o símbolo inicial como raiz  Não-terminais formam nós intermediários  As folhas são os terminais (tokens) da cadeia

Análise Sintática Vimos que gramáticas são formalismos que geram cadeias Em compiladores, não vamos gerar uma cadeia, mas já temos a cadeia de terminais (ou seja, de tokens) pronta... Diante disso, qual seria a função do analisador sintático?

Introdução à Análise Sintática

Análise Sintática O objetivo  Descobrir como uma seqüência de tokens pode ser gerada pela gramática da linguagem Em outras palavras  Entrada: seqüência de tokens  Saída: árvore

Análise Sintática O módulo de software responsável por essa etapa pode ser chamado de  Analisador sintático ou parser (reconhecedor) Existem duas estratégias algorítmicas que podem ser adotadas  Bottom-up ou Ascendente  Top-down ou Descendente

Análise Sintática Usaremos a seguinte gramática não-ambígua para ilustrar, a seguir, as duas estratégias de análise sintática ::= | "+" ::= "x" | "i"

Análise Descendente Parte da raiz (não-terminal inicial) e tenta criar a árvore de cima para baixo Para cada não-terminal, tenta adequar a cadeia de tokens (lida na entrada) a uma de suas produções  O desafio é escolher a produção adequada... Se a produção tiver não-terminais, faz um processo similar para aquele não-terminal O processo de construção da árvore lembra uma derivação mais à esquerda da cadeia

Análise Descendente O parser vai ter que escolher uma produção adequada para o símbolo inicial expressão i+i+x ?

Análise Descendente Sabe-se que ambas as produções iniciam com, variando o restante i+i+x expressão termo ? ?

Análise Descendente Ao ler o token “i”, o parser identifica que é gerado por, mas falta decidir o resto... i+i+x expressão termo ?

Análise Descendente A descoberta do “+” faz o parser decidir a produção adequada expressão i+i+x termo ?

Análise Descendente Processo similar acontece após a leitura dos dois tokens seguintes expressão i+i+x termo expressão ?

Análise Descendente Porém, no último token, vai ter apenas e o parser encerra no EOF (fim de arquivo) expressão i+i+x termo expressão termo EOF

Análise Descendente Veremos na próxima aula como construir um parser desse tipo com relativa facilidade Agora, vamos ver como funciona a estratégia ascendente (de baixo para cima)

Análise Ascendente Parte das folhas (tokens) e tenta crescer a árvore até a raiz (símbolo inicial) Para isso, compara a seqüência de símbolos o lado direito (ou corpo) das produções para tentar criar um ramo da árvore Diz-se que a seqüência é “reduzida” ao não- terminal do lado esquerdo da produção

Análise Ascendente Tenta crescer a árvore usando o corpo das produções, até chegar ao símbolo inicial expressão i+i+x

Análise Ascendente O token “i” é reduzido ao não-terminal, devido à produção ::= “i” i+i+x termo

Análise Ascendente O parser lê o token “+”, mas ainda não pode fazer uma redução i+i+x termo

Análise Ascendente Mais uma redução ao não-terminal i+i+x termo

Análise Ascendente Apenas continua a leitura i+i+x termo

Análise Ascendente Nova redução ao não-terminal i+i+x termo

Análise Ascendente Como acabaram-se os tokens, o último só pode ser gerado diretamente por, então reduz i+i+x termo expressão termo EOF

Análise Ascendente Agora, a subcadeia “ + ” pode ser reduzida para i+i+x termo expressão termo expressão termo

Análise Ascendente Outra redução, usando a mesma produção expressão i+i+x termo expressão termo

Descendente x Ascendente A análise sintática descendente é mais fácil de entender e de implementar, porém a ascendente é mais poderosa (aplicável em mais linguagens) Uso principal das duas estratégias  Ascendente: geralmente, usado apenas em geradores semi-atomáticos de parsers  Descendente: tem uma técnica simples de implementar manualmente (e outras usadas em geradores também)

Descendente x Ascendente Chama-se gramática LL àquela que permite a construção de um parser descendente para reconhecê-la Chama-se gramática LR àquela que permite a construção de um parser ascendente para reconhecê-la

Análise Sintática Além de construir a árvore, outras atribuições importantes do analisador sintático são:  Reportar erros, o que deve ser feito de maneira clara para permitir ao usuário corrigir o problema  Recuperar-se de erros automaticamente (pouco uso em compiladores comerciais)

Análise Sintática Na verdade, a análise sintática não precisa construir a árvore durante o reconhecimento Só é necessário construir a árvore se ela for realmente separada das etapas seguintes  Em “passagens” distintas  Passagem – percorrer todo o código fonte Em todo caso, o parser vai funcionar descobrindo como a árvore poderia ser construída, na gramática dada,para os tokens dados