Projeto de Tradutor Preditivo. Introdução Introdução Esquemas L-atribuidos são reconhecidos por analisadores Top-Down. Entre estes analisadores, se encontra.

Slides:



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

Tópicos em Compiladores
gerador de código intermediário
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.
Paradigmas da Programação – Semestre 1 – Aula 6
III – Análise sintáctica
IV – Análise semântica DEI Associação de regras semânticas a produções
III – Análise sintáctica
III – Análise sintáctica
Deyvisson, Rafael M.P., Renato, Robson C.F., Rodolfo
Análise Sintática Ascendente ­
Algoritmos e Estrutura de Dados I
Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.
Profa. Heloise Manica Paris Teixeira
Análise Sintática - Continuação
JavaCC e JJTree Geração de compiladores implementados em Java
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Árvores Introdução e Aplicações Árvores de Busca Binária Fundamentos
YACC.
Análise Sintática Ascendente
Relações em uma Gramática
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
Construção de Compiladores
Listas com Ponteiros Listas encadeadas Listas circulares.
5.6 – Complementos de Yacc – Usando Yacc com gramáticas ambíguas
Linguagem C Funções.
CRIANDO OBJETOS EM JAVA
Subprogramas São blocos de execução internas a um programa.
Análise léxica e sintática
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação.
Determinar o tipo de gramática
Compiladores, Aula Nº 9 João M. P. Cardoso
Eric, Fabrício, João Vicente
Árvores Binárias de Pesquisa
Prof. Ricardo Santos PONTEIROS
Técnicas de Desenvolvimento de Programas
Esquemas de Tradução Prof. Alexandre Monteiro
Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery.
Análise Léxica.
Capítulo II Gramáticas e Linguagens
Aula 14 1 Análise Sintáctica Compiladores, Aula Nº 14 João M. P. Cardoso.
Analise sintática aula-07-analise-sintática.pdf.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Esquemas L-atribuídos
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Análises léxica e sintática
Analise Semântica aula-10-analise-semântica.pdf.
Aula Prática 1 Monitoria IP/CC (~if669). Verificação Dinâmica de Tipos Métodos de superclasses e subclasses: Uso de métodos de subclasses quando se é.
Aula 12 1 Análise Sintáctica Compiladores, Aula Nº 12 João M. P. Cardoso.
Compiladores.
Análise Sintática Prof. Alexandre Monteiro
Laboratório de Programação II Método Construtor Dados e Métodos de Objetos Prof Edivaldo - Network.
Tradução Dirigida por Sintaxe
Árvores Binárias Profa. Patrícia A. Jaques Luiz Gonzaga Jr
CES-41 COMPILADORES Aulas Práticas Capítulo II A Ferramenta Yacc.
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.
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.
Uma Infraestrutura para a
Prof. Marcos LABORATÓRIO DE PRÁTICA DE PROGRAMAÇÃO 06.
Análise Semântica e Representação Intermédia
Linguaguem de Programação II
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.
Análise Contextual Mauro Araújo Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Transcrição da apresentação:

Projeto de Tradutor Preditivo

Introdução Introdução Esquemas L-atribuidos são reconhecidos por analisadores Top-Down. Entre estes analisadores, se encontra o Preditivo, que é implementado via chamadas recursivas. Veremos uma forma de se implementar tal tradutor, considerando os atributos (herdados e sintetizados)

Método de execução Para cada não-terminal da gramática, construir uma função que tenha como retorno o valor do(s) atributo(s) sintetizado(s) desse não- terminal. Se esse não-terminal possuir atributos herdados, estes parâmetros deverão ser parâmetros da função criada. Os símbolos que existirem nas produções desse não terminal devem estar nessa função como variáveis locais. O código da função criada deve decidir qual produção irá processar, com base no símbolo lido na entrada.

Método de execução Exemplo: ◦ Sendo a produção A → B C {A.a = C.c} ◦ Deve ser criada uma função de nome A, que retorne o valor a (referente a A). ◦ Internamente à função deve haver a variável c: int A(); { int c; } a = A();

Método de execução Considerando as produções para o não- terminal, da esquerda para a direita, o código da função associada a este não terminal deve: 1.Para cada token x da produção, verificar se x é o token lido realmente, e avançar a leitura; 2.Para cada não-terminal B do lado direito da produção, se este não terminal tiver atributo sintetizado (bs) e herdados (b 1, b 2, b 3...), gerar uma chamada à função para esse símbolo da forma bs = B(b 1, b 2, b 3...) 3.Para cada ação semântica na produção, copiar o código, substituindo cada referência existente a algum atributo pela variável local referente a esse atributo.

Exemplo Considerando a produção: E → T {X.h = T.ptr} X {E.ptr = X.s} Vê-se que E possui apenas um atributo sintetizado (ptr), nenhum atributo herdado; T possui um atributo sintetizado (ptr); e X possui os atributos h e s. Portanto, a função E não terá parâmetros, devendo retornar o valor de ptr (de E), e terá como variáveis locais: h, s, ptr1 (de T).

Exemplo Para a gramática abaixo, vista anteriormente: E → T {X.h = T.ptr} X {E.ptr = X.s} X → + T {X 1.h = geranodo(‘+’,X.h,T.ptr)} X 1 {X.s = X 1.s} X → ε {X.s = X.h} T → num {T.ptr = gerafolha(num,num.lexval)} T → id {T.ptr = gerafolha(id,id.indice)} E sendo ptr um ponteiro para um nodo da árvore, serão definidas as funções: ◦ *node E(); ◦ *node X(h: *node); ◦ *node T();

Exemplo Para o símbolo X, que contém atributos herdados e sintetizados, e sendo op_a o token do operador de adição: X → op_a T {X 1.h = geranodo(op_a.lexval,X.h,T.ptr)} X 1 {X.s = X 1.s} | X → ε {X.s = X.h} A função a ser construida poderia ser: *nodo X(h: *nodo); { *nodo h1, ptr, s, s1; if (token == op_a) { //produção op_a T X token = letoken(); ptr = T(); h1 = geranodo(op_a.lexval, h, ptr); s1 = X(h1); s = s1; } else { s = h; } return s; }