Análise Sintática Recursiva e Preditiva

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
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
Análise Sintática - Continuação
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
Gramáticas Livres de Contexto
Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat
Análises léxica e sintática
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Análises léxica e sintática
Análise Sintática Prof. Alexandre Monteiro
Análise Sintática de Descida Recursiva
Compiladores Análise Sintática
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.
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.
Compiladores - Introdução. O que é um Compilador? “Um compilador é um programa que lê um programa escrito em uma linguagem (linguagem fonte) e a traduz.
Reconhecimento de Padrões Métodos Sintático e Estrutural Disciplina: Tópicos em Inteligência Artificial Prof. Josué Castro.
Douglas Matheus de Souza Prof. Marcel Hugo, Mestre - Orientador.
Diagramas Dinâmicos Diagramas de Interação Diagramas de Sequência Diagramas de Colaboração Diagramas de Estado (Statechart) Diagramas de Atividade.
Operator-precedence Parser
Casamento de Padrão Aproximado e Compressão de Huffaman
Teoria dos Grafos Geração de Valores aleatórios
Projeto de Compiladores
Organização, Sistemas e Métodos
Diagrama de estado Higo Vale Kleber Baingo
CT–200: Fundamentos de Automata e Linguagens Formais
Construção de Compiladores
Teoria da Computação Prof. Msc. Ricardo Loiola
Prof. Wellington Franco Sub-Rotinas:Funções e Procedimentos
INF1007 – Programação 2 9 – Pilhas
Conjuntos numéricos A história nos mostra que desde muito tempo o homem sempre teve a preocupação em contar objetos e ter registros numéricos. Seja através.
INTRODUÇÃO AO CONTROLE ESTATÍSTICO
M.d.c. algoritimo de Euclides
Estrutura de dados Pilhas e filas
Diagrama de Atividade Prof. Thales Castro.
FUNDAMENTOS DE PROGRAMAÇÃO
FEUP/LEEC Algoritmos e Estruturas de Dados 2001/2002
COMPILADORES 06 Prof. Marcos.

Análise Sintática Botton Up Diomara M. R. Barros
Introdução à Computação
Traduções Dirigidas por Sintaxe
Técnicas de orçamento de capital
CT Fundamentos de Automata e Linguagens Formais
Computação Eletrônica Vetores e Matrizes
Sistemas Inteligentes Busca Cega (Exaustiva)
Estruturas de Dados em C
Aula 7 – Algoritmos Genéticos
Compiladores – Conceitos Básicos
Prof. Sidomar
Programação Dinâmica (PD)
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:

Análise Sintática Recursiva e Preditiva Compiladores Prof. Diomara Martins Reigato Barros FEMA - IMESA 15/09/2018

Objetivo Demonstrar a Análise Sintática Top Down e os dois métodos existentes: Análise Sintática Recursiva e Análise Sintática Preditiva LL(1), bem como a construção da tabela LL(1) e as ações do analisador sintático.

Tópicos Revisão sobre as fases da compilação Análise Sintática Analisador Sintático Top Down Análise Descendente Recursiva Análise Sintática Preditiva LL(1) Tabela Sintática Preditiva Ações do Analisador Sintático Preditivo Conclusão

O Compilador Programa Fonte (linguagem fonte) Compilador (compiler) Alvo (linguagem alvo) Mensagens de erro

Fases da Compilação

Análise Sintática É a segunda fase de um compilador. É responsável pela leitura do fluxo de tokens produzido pelo analisador léxico checando se tal fluxo pode ser gerado pela gramática da linguagem-fonte. Também é chamada de análise gramatical ou parsing. Verifica os elementos estruturais do programa Os resultados dessa Análise são demonstrados na forma de Árvores Sintáticas.

O Analisador Sintático: – algoritmo que recebendo como entrada uma sentença x, emite como saída: ● Árvore Sintática de x, se x pertence à linguagem ● erro Sintático, caso x não pertença à linguagem. 7

Posicionamento da Anal. Sintática Representação Intermediária Programa Fonte Obter Token Analisador Léxico Analisador Síntático Resto da interface de vanguarda Token Árvore Gramatical Tabela de Símbolos

Dois métodos de algoritmos: Análise Sintática Top Down (Descendente) constroem árvores do Topo para as Folhas Análise Sintática Botton Up (Ascendente) começam pelas folhas até a raiz - Nos dois métodos a entrada é varrida da esquerda para a direita, um símbolo de cada vez

Derivações podem variar, até mesmo quando a árvore sintatica não existe: Derivação mais a esquerda (Slide 9 era mais direita): (1) exp  exp op exp [exp  exp op exp] (2)  (exp) op exp [exp  ( exp )] (3)  (exp op exp) op exp [exp  exp op exp] (4)  (number op exp) op exp [exp  number] (5)  (number - exp) op exp [op  -] (6)  (number - number) op exp [exp  number] (7)  (number - number) * exp [op  *] (8)  (number - number) * number [exp  number]

Tipos de Analisadores Sintáticos 1 6 2 7 4 3 5 1 2 3 5 6 7 8 9 4 10 Estratégia de Construção Top-Down Estratégia de Construção Bottom-Up

Mas o que acontece se a árvore sintática variar?[ exp op exp op exp ] correta A gramática é ambígua, por quê precisamos tomar cuidado? Semântica!

Notação Extra: Inicial: Backus-Naur Form (BNF) Extended BNF (EBNF): Meta símbolos são |   Extended BNF (EBNF): Novos meta símbolos […] e {…}  em grande parte eliminado por estes

EBNF Meta símbolos: Colchetes […] significam “opcionais” (como ? Em expressões regulares) Chaves {…} significam “repetição” (como * em ER)

Chaves em EBNF Troca somente a repetição a esquerda: exp  exp + term | term exp  term { + term } Exemplo: expexp soma termo | termo Soma  + | - Termo  termo mult fator | fator Mult  * Fator  (exp) | número

EBNF correspondente é: exp termo {soma termo} Soma  + | - Termo  fator { mult fator} Mult  * Fator  (exp) | número

Necessidade de Conhecimentos: Gramática Livre de Contexto (GLC) Expressões Regulares Simplificação de Gramática Eliminação de Recursão à Esquerda Conjuntos de Primeiro e sequência Árvores Gramaticais

Analisador Sintático Top Down Analisadores com Retrocesso(Recursivos) testa diferentes possibilidades, retrocedendo se alguma falhar Analisadores Preditivos tenta prever a construção seguinte, com base em uma ou mais marcas à frente

Análise Sintática Top Down Descendente Recursiva ● O processo é ineficiente, pois leva à repetição da leitura de partes da sentença de entrada ● Quando ocorre um erro, não é possível determinar o ponto exato onde este ocorreu, devido à tentativa de produções alternativas. ● Uma gramática recursiva à esquerda pode gerar um ciclo infinito de expansão de não-terminais, mesmo com retrocesso, pode levar a um laço infinito.

DESCENDENTES RECURSIVOS Para Exemplo: considere a gramática: ● S  cAd ● A  ab | a Para a cadeia cad: S A d c a b (1) Expansão A com 1a. produção (2) Retrocesso devido erro S A d c a (0) Expansão de S S A d c a (3) Expansão A com 2a. produção

Como visto no exemplo anterior: a construção da árvore gramatical começa de cima para baixo usando o símbolo de partida; a medida em que são encontrados os símbolos não-terminais são expandidos; da mesma forma são consumidos um a um os símbolos terminais encontrados; quando um símbolo terminal não tem correspondência com a produção em uso ocorre o retrocesso.

ANÁLISE PREDITIVA LL(1) LL = varredura (Esquerda para Direita) Left-to-right das entradas e constrói uma derivação mais a (Leftmost) esquerda 1 = usa apenas 1 símbolo de entrada para prever a derivação da análise.

Estrutura de um An. Sintático Preditivo LL(1)

O termo Preditivo deve-se ao fato de que a pilha sempre contém a descrição do restante da sentença (se ela estiver correta); isto é, prevê a parte da sentença que deve estar na entrada para que a sentença esteja correta.

Tabela Sintática Preditiva Em cada entrada da tabela M existe uma única produção viabilizando a análise determinística da sentença de entrada. Para isso é necessário que a gramática: – Não possuir recursão à esquerda; – Estar fatorada (ser determinística)

Exemplo de Gramática Recursiva à esquerda: Para a gramática : E  E + T | T T  T * F | F F  (E) | id Eliminando a recursão à esquerda de E e T: E  TE’ E’  +TE’ |  T  FT’ T’  *FT’ |  F  (E) | id

Tabelas Sintáticas Preditivas O funcionamento dos analisadores sintáticos preditivos não-recursivos depende de tabelas sintáticas preditivas. A construção de tais tabelas pode ser realizada através do uso de algoritmos conhecidos. Tal construção é facilitada através de algumas funções associadas a gramática a ser analisada: Conjuntos de PRIMEIRO e SEQUENCIA.

Conjuntos de Primeiro Seja X um símbolo gramatical (Não-terminal). O conjunto Primeiro de X é composto por terminais, e possivelmente (ε). Para isso separamos a gramática em regras e vamos definindo os conjuntos de primeiros, através de várias passadas pelas regras até que não haja mais alterações.

Exemplo de Gramática S (S)S| ε (1) S (S)S (2) S ε PRIM(S) = {( , ε}

Conjuntos de Sequencia Dado um Não Terminal X, o conjunto de sequência(X) é composto por terminais e possivelmente $, é definido como segue: Se X for o símbolo inicial, então $ pertence a Sequencia(X). SEQ(X) = {$} Para X AB  , então: Seq(A)=PRIM(B) – {ε} (Se em PRIM(B) produz (ε), então também coloque SEQ(X) em SEQ(A))

Cont. Conjuntos de Sequencia -Se no lugar de B fosse um Não terminal (,) por exemplo, então: X  A , SEQ(A) = {,} No caso do Não Terminal(B):  X AB -Quando à direita do não terminal não estiver mais nada, ou seja, ele é o último, então: SEQ(B) = SEQ(X)  = {$}

Exemplo da Gramática Anterior S (S)S| ε (1) S (S)S (2) S ε PRIM(S) = {( , ε} SEQ(S) = {$ , )}

Tabela Análise Sintática Top-down PRIM SEQ S a,d $ B c, ε D a, ε b Gramática G1 S  aB|d B  cDb| ε D  a| ε Gramática G2 S  aSa|A A  bB B  cBc|c PRIM SEQ S a,b a,$ A b B c a,c,$

Tabela Análise Sintática Top-down Gramática G3 Z  XYZ|d Y  c| ε X  Y|a PRIM SEQ Z d,a,c, ε $ Y c, ε $,a,c,d X a,c, ε $,c PRIM SEQ E n,( $,) X +,-, ε S +,- T +,-,$,) Y *, ε M * F *,+,-,$,) Gramática G4 E  TX X  STX| ε S  +|- T  FY Y  MFY| ε M  * F  (E)|n Gramática G4 E  EST|T S  +|- T  TMF|F M  * F  (E)|n

Tabela Análise Sintática Top-down Gramática G5 S (A)|b A  B:A|B B  a|  first follow S b,( $ A a,  ) B :,) Gramática G6 S (A)|b A  A;B|B B  a|  first follow S b,( $ A a, ) X ;,  B a,  ;,) -- fatoração --- S  (A)|b A  BX X  ;BX| B  a|

Construção de Tabelas Sintáticas Preditivas A tabela é uma matriz M[N,T], composta pelos Não-terminais nas Linhas e terminais nas colunas + $ Montamos a tabela verificando os Conjuntos de Primeiro, para cada terminal dos conjuntos de Primeiro, adicionamos na tabela as regras referentes aos terminais. Se ε pertence ao conjunto de Primeiro, então essa produção para ε é inserida em todos os conjuntos de sequencia desse Não terminal.

Construção de Tabelas Sintáticas Preditivas Prim Seq S ( , ε $ , ) S (S)S|ε M[N,T] ( ) $ S S (S)S S ε

Analisador Sint.Preditivo LL(1) ● tem como função determinar a partir de X (topo da pilha) e de a (o próximo símbolo) a ação a ser executada: ● Se X = a = $  o analisador anuncia o final da análise. ● Se X = a <> $  o analisador retira X do topo da pilha e a da entrada. (reconhecimento sintático de a, chamamos isso de casamento)

Analisador Sint.Preditivo LL(1) Duas Ações do Analisador Top Down Preditivo: - substituir um não-terminal A do topo da pilha por uma cadeia, com base na escolha da regra gramatical, através da tabela sintática LL(1) - Casar uma marca no topo da pilha com uma marca de entrada seguinte, se os terminais forem iguais.

Analisador Sint.Preditivo LL(1) A Análise Sintática Top Down é bem sucedida se Pilha = $ e Cadeia de entrada = $, caso contrário ERRO.

Ações do Analisador Sintático Preditivo para o reconhecimento de cadeias de entrada Através da tabela LL(1) é possível definir as ações do analizador : 1 – Enumerar os passos 2 - A cadeia de entrada é finalizada por $. 3 - A pilha, também finalizada por $, é iniciada com o símbolo inicial da gramática. 4 – Efetuar as ações.

Ações do Analisador para a Cadeia ( ) Tabela Preditiva LL(1) M[N,T] ( ) $ S S (S)S S ε Ações:

Outro exemplo de construção de tabela Definir as ações para a entrada (a:a)

Conclusão O analisador sintático agrupa os tokens fornecidos pelo analisador léxico em estruturas sintáticas, construindo a árvore sintática correspondente que é passada para a próxima fase. Para isso, utiliza uma série de regras de sintaxe, que constituem a gramática da linguagem fonte. É a gramática da linguagem que define a estrutura sintática do programa fonte. O analisador sintático tem também por tarefa o reconhecimento de erros sintáticos, que são construções do programa fonte que não estão de acordo com as regras de formação de estruturas sintáticas como especificado pela gramática.

Referência Bibliográfica AHO, A.V.; SETHI, R.; ULLMAN, J.D., LAM, M.S. Compiladores: princípios, técnicas e ferramentas. 2.ed. São Paulo: Pearson Addison - Wesley, 2008. 634 p.