Construção de Compiladores

Slides:



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

Software Básico Silvio Fernandes
SISTEMAS OPERACIONAIS (SO) Aula 5 Luciana A. F. Martimiano 2002
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
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
III – Análise sintáctica
Universidade Federal de Campina Grande – UFCG Centro de Engenharia Elétrica e Informática – CEEI Departamento de Sistemas e Computação – DSC Máquina de.
TEORIA DA COMPUTAÇÃO Parte II  Linguagens Livres de Contexto
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 ­
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 Dada uma cadeia de terminais w, queremos saber se wL(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode.
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Análise Sintática Ascendente
Relações em uma Gramática
Linguagem de Prog. e Programas
Autômatos Finitos Determinísticos
Análise Léxica Supondo o trecho de programa abaixo:
Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Verificação de Tipos.
Construção de Compiladores
*(+num) Expr Expr Op Expr Expr (Expr) Expr - Expr Expr num Op + Op - Op * Pilha Buffer com string de entrada.
Construção de Compiladores
Construção de Compiladores
Construção de Compiladores
5.6 – Complementos de Yacc – Usando Yacc com gramáticas ambíguas
Buscas em Grafos Prof. André Renato 1º Semestre/2012
Denis Pinheiro Teoria de Linguagens Prof. Newton José Vieira
Informática Teórica Engenharia da Computação
Análise léxica e sintática
Determinar o tipo de gramática
Compiladores, Aula Nº 19 João M. P. Cardoso
Compiladores, Aula Nº 9 João M. P. Cardoso
Gramáticas Livres de Contexto
Aula 17 1 Análise Sintáctica Compiladores, Aula Nº 17 João M. P. Cardoso.
Teoria e Implementação de Linguagens Computacionais
Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat
Análises léxica e sintática
Análise Léxica e Sintática
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.
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
CES-41 COMPILADORES Aulas Práticas Capítulo II A Ferramenta Yacc.
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.
Revisão Compiladores – AP2
Análise Sintática de Descida Recursiva
Compiladores Análise Sintática
COMPILADORES 04 Prof. Marcos.
Sintaxe de uma Linguagem
Analisador sintático: Tipos de análises sintáticas
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Transcrição da apresentação:

Construção de Compiladores Analise Sintática II

Métodos de Analise Sintática Podem seguir duas abordagens: Métodos bottom-up Utilizam derivação inversa Tenta casar partes da entrada com o lado direto das produções Métodos top-down Sempre partem da raiz (top-down) São baseados em derivações sucessivas Devem usar busca direcionada Tais abordagens pode ser com ou sem Backtracking Com = maior número de gramáticas, porém mais complexo e lento Sem = menor número de gramáticas, porém simples e eficiente

Método Bottom-up Exemplo: Shift-Reduce através de Pilhas Pilha que armazena os símbolos da gramática Buffer que contem a sentença a ser reconhecida Tabela de de Precedência (TP) de operadores (opcional) TP - determinará as relações de precedência entre os operadores e será consultada para determinar o curso de ação em cada passo. Convencionando que $ é o símbolo inicial da pilha e, ainda, marca o final da sentença a ser reconhecida, e que w é a sentença a ser reconhecida teremos inicialmente: PILHA: $ e BUFFER: w$

Método Bottom-up Procedimento de análise shift-reduce Transfere (shift) os símbolos da entrada um a um para a pilha até que o lado direito de uma produção apareça no topo da pilha. Quando isto ocorrer, o lado direito da produção deve ser trocado (reduced) pelo lado esquerdo da produção em questão. Esse processo deve ser repetido até que toda a sentença de entrada tenha sido analisada. Ao final do processo, a sentença estará sintaticamente correta se e somente se a entrada estiver vazia e a pilha contiver apenas o símbolo inicial da gramática.

Método Bottom-up Exemplo: y – 2 * y Gramática

Método Bottom-up Três maneiras de tratar conflitos Implementar um método lookahead Alterar a gramática para evitar ambiguidade Utilizar a tabela de precedência A gramática não deve conter produções vazias O lado direito das produções das gramáticas não pode possuir dois não-terminais adjacentes

Método Bottom-up A gramática G = ({E}, {id, +, -, *, /, (, )}, P, E}, onde P: E  E+E | E-E | E*E | E/E | E-E | (E) | id Exemplo de tabela de precedência Quando a relação de precedência entre o símbolo do topo da pilha e a posição atual da sentença for < ou = é feito um shift (empilha símbolo corrente do buffer na pilha) Quando a relação de precedência entre o símbolo do topo da pilha e a posição atual da sentença for > é feito um ou mais reduce na pilha

Método Bottom-up Já trás mensagens de erro e1: falta operando e2: parênteses não balanceados e3: falta operador

Método Top-down Exemplo: Gramática ambígua 1 T  R T  aTc R   R  RbR 2 ?

Método Top-down Podemos escolher uma das seguintes opções: Análise preditiva recursiva Construção de um conjunto de procedimentos, normalmente recursivos, um para cada símbolo não-terminal da gramática em questão Análise preditiva LL(1) Implementa o método descendente utilizando explicitamente uma pilha

Método Top-down Análise preditiva recursiva: Seja a gramática Podemos reescrevê-la como: <cmd> → begin <lista_cmds> end | while <condição> do <cmd> | if <condição> then <cmd> <expr> → <termo> + <expr> | <termo> <termo> → <fator> * <termo> | <fator> <fator> → <primário> ** <fator> | <primário> <primário> → IDENT | NÚMERO | ( <expr> ) <expr> → <termo> { + <expr> }* <termo> → <fator> { * <termo> }* <fator> → <primário> { ** <fator> }* <primário> → IDENT | NÚMERO | ( <expr> )

Método Top-down Análise preditiva recursiva: Procedimento analisador_sintático { obtenha_símbolo(); /* chama o analisador léxico */ EXPR(); } Procedimento EXPR() { TERMO(); se símbolo_lido = '+' então { obtenha_símbolo(); EXPR(); } <expr> ::= <termo> { + <expr> }*

Método Top-down Análise preditiva recursiva: Procedimento TERMO() { FATOR(); se símbolo_lido = '*' então { obtenha_símbolo(); TERMO(); } <termo> ::= <fator> { * <termo> }* Procedimento FATOR() { PRIMÁRIO(); se símbolo_lido = '**' então { obtenha_símbolo(); FATOR(); } <fator> ::= <primário> { ** <fator> }*

Método Top-down Análise preditiva recursiva: Procedimento PRIMÁRIO() { se símbolo_lido = IDENT então { /* trate adequadamente um identificador */ obtenha_símbolo(); } senão se símbolo_lido = NÚMERO então { /* trate adequadamente um número */ senão se símbolo_lido = '(' então { EXPR(); se símbolo ≠ ')' então ERRO( "falta )" ); senão <primário> ::= IDENT | NÚMERO | ( <expr> )

Método Top-down Análise preditiva recursiva Limitações do método: Entra em ciclo (loop) para gramáticas recursivas à esquerda Não lida com regras não-determinísticas(A → αβ e A → αγ) Requer uma linguagem com recursividade na implementação

Adaptando a Gramática Retirar recursão à esquerda Um não-terminal A, em uma GLC G=(N,T,P,S) é recursivo se A → A, para  e   (NT)*. Se  =, temos recursão a esquerda Se  =, temos recursão a direita Uma GLC G=(N,T,P,S) possui recursão à esquerda direta se P contém pelo menos uma produção da forma A → A. Uma GLC G=(N,T,P,S) possui recursão à esquerda indireta se existe em G uma derivação da forma A →n A, para algum n2

Adaptando a Gramática Retirar recursão à esquerda Considere A ::= Aα | β A recursividade pode ser eliminada substituindo-se as produções de G(A) por: A ::= βA' A'::= αA' | ε

Adaptando a Gramática Retirar recursão à esquerda O processo elimina toda recursividade direta à esquerda, mas não elimina toda recursividade à esquerda S  Aa | b A  Ac | Sd | e Devemos usar um algoritmo geral de eliminação de recursividade à esquerda Gramática recursiva à esquerda em S

Adaptando a Gramática

Adaptando a Gramática Retirar recursão à esquerda (Exemplo)

Adaptando a Gramática Retirar recursão à esquerda (Exemplo)

Adaptando a Gramática Retirar recursão à esquerda (Exemplo) S – (A1) não tem recursividade direta à esquerda Eliminando a recursividade direta de A2 temos:

Adaptando a Gramática Retirar não determinismo Caracterizado por: Retiramos o determinismo através da seguinte transformação: A  C C   | 