Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008



Documentos relacionados
Orientação a Objetos

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Linguagens de Programação Aula 10

1.6. Tratamento de Exceções

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Introdução a Java. Hélder Nunes

Estrutura de Dados. Unidade VI. -Tabela Hash -Grafos. Prof. Ms. Amilton Souza Martha

Análises Geração RI (representação intermediária) Código Intermediário

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Arquiteturas RISC. (Reduced Instructions Set Computers)

2 Diagrama de Caso de Uso

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos?

DIFERENÇAS ENTRE FUNÇÃO E BLOCO FUNCIONAL; CRIAÇÃO DE FUNÇÃO / BLOCO FUNCIONAL; UTILIZAÇÃO NO LADDER; EXEMPLO DE BLOCO FUNCIONAL;

DAS5102 Fundamentos da Estrutura da Informação

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

PROGRAMANDO EM C# ORIENTADO A OBJETOS

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Sistemas Operacionais

Arquitetura de Computadores - Arquitetura RISC. por Helcio Wagner da Silva

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

1.1. Organização de um Sistema Computacional

Geração de código intermediário. Novembro 2006

Busca. Pesquisa sequencial

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

Resolução de problemas e desenvolvimento de algoritmos

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

Recursos. Um recurso é ou um dispositivo físico (dedicado) do hardware, ou Solicitar o recurso: esperar pelo recurso, até obtê-lo.

Modelagemde Software Orientadaa Objetos com UML

Hashing. Rafael Nunes LABSCI-UFMG

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Síntese. Compiladores. Geração de código intermediário. Linguagens Intermediárias. Modelo Clássico. Linguagens Intermediárias. Código intermediário

Universidade de São Paulo São Carlos, SP Instituto de Ciências Matemáticas e de Computação. SSC0206 1/2010 Introdução à Compilação

15/03/2010. Análise por pontos de função. Análise por Pontos de Função. Componentes dos Pontos de Função. Componentes dos Pontos de Função

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

HASHING. Katia Guimarães. 1

Introdução a POO. Introdução a Linguagem C++ e POO

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

Algoritmos e Linguagem de Programação I

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Introdução. Introdução. Introdução. Organização Estruturada de Computadores. Introdução. Máquinas Multiníveis

Árvores Binárias Balanceadas

ISO/IEC 12207: Gerência de Configuração

Análise de Ponto de Função

COMPILADORES E INTERPRETADORES

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

Introdução à Programação

Feature-Driven Development

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada;

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Orientação a Objetos

Algoritmos e Estrutura de Dados III. Árvores

Programação Básica em STEP 7 Operações Binárias. SITRAIN Training for Automation and Drives. Página 6-1

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Conceitos de Banco de Dados

Banco de Dados Aula 1 Introdução a Banco de Dados Introdução Sistema Gerenciador de Banco de Dados

Aula 1 Tipo Abstrato de Dados

UNIDADE 6 - PROGRAMAÇÃO MODULAR

04/08/2012 MODELAGEM DE DADOS. PROF. RAFAEL DIAS RIBEIRO, MODELAGEM DE DADOS. Aula 2. Prof. Rafael Dias Ribeiro. M.Sc.

Engenharia de Software III

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Sistema de Arquivos. Ambientes Operacionais. Prof. Simão Sirineo Toscani

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Terceira Avaliação Visualg & Pascal

INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E AULA TEÓRICA 2 PROF. MARCELO LUIZ SILVA (R E D)

AULA 1 INTRODUÇÃO - ENGENHARIA DE SOFTWARE. Prof. Msc. Hélio Esperidião

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna

Este trabalho tem como objetivo praticar o uso de tipos abstratos de dados e estruturas do tipo Lista.

SIE - SISTEMA DE INFORMAÇÕES PARA O ENSINO CADASTRO DE UNIDADES ADMINISTRATIVAS

Java 2 Standard Edition Como criar classes e objetos

Geração e Otimização de Código

6.3 Equivalência entre Autômatos com Pilha Não-Determinísticos e Gramáticas Livre do Contexto

2ª Lista de Exercícios

Gerenciamento de Memória

1. NÍVEL CONVENCIONAL DE MÁQUINA

Modelos. Comunicação com clientes

Informática I. Aula 5. Aula 5-13/05/2006 1

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Árvores Binárias de Busca

Tecnologia em Gestão Pública Desenvolvimento de Projetos - Aula 9 Prof. Rafael Roesler

Transcrição:

Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário, postergar a construção da tabela de símbolos até após o parsing ter sido concluído. É mais fácil construir a tabela de símbolos com informações vindas do scanner e parser. 2 Principais Operações As principais operações na tabela de símbolos são: Inserir: Usada para armazenar informações, tais como, tipo e escopo, na tabela de símbolos. Verificar: Usada para recuperar informações associadas a um nome, quando esse nome é utilizado como um código. Remover: Usada para remover informações quando estas não serão mais utilizadas. Estrutura da Tabela de Símbolos Tipicamente, a tabela de símbolos é uma estrutura de dados do tipo de um dicionário. A eficiência das três operações básicas varia de acordo com a organização da estrutura de dados. Implementações típicas de estruturas de dicionários são listas lineares, árvores de busca e tabelas de hashing. A lista linear implementa inserção com tempo O(1) e de verificação e remoção com tempo O(n). 3 4 Estrutura da Tabela de Símbolos A tabela de hashing implementa inserção, verificação e remoção com tempo O(1). A maior desvantagem da tabela de hashing são as colisões de mapeamento, que degradam o desempenho das funções de verificação e remoção. A árvore de busca binária implementa as operações de inserção e verificação O(log(n)). Entretanto, a operação de deleção é bastante ineficiente. O comportamento de uma tabela de símbolos depende fortemente das propriedades das declarações da linguagem. A forma como as operações inserir e remover manipulam a tabela, quando elas devem ser ativadas, quais atributos devem ser inseridos, id etc. variam para cada linguagem. Até mesmo o momento em que a tabela deve ser construída, e por quanto tempo ela deve existir, pode variar entre diferentes linguagens. 5 6 1

Existem 4 tipos básicos de declarações: 1. Declaração de Constantes: 2. Declaração de Tipos: Declaração type em Pascal: 3. Declaração de Variável: 4. Declaração de Procedimentos e Funções: Declaração struct e union em C: 7 8 Declaração de Constantes de Tipos Declaração de Constante = Associação de valores a nomes (ou seja, ligação entre valores) Valores de uma constante: O Pascal necessita que os valores na declaração de uma constante sejam estáticos C permite que as constantes sejam dinâmicas (somente computáveis durante a execução) uma única atribuição. Tipos de uma constante: Em Pascal, tipos de dados de constantes são implicitamente determinados de seus valores estáticos Em C, os tipos de dados são providos explicitamente, assim como em declarações de variáveis. de tipos = associação de um nome a uma tipo construído recentemente ou criação de um alias para um tipo nomeado existente. Nomes de tipos são comumente utilizados em conjunto com um algoritmo de equivalência de tipo para realizar a verificação de tipo de um programa de acordo com as regras da liguagem. 9 10 Declaração de Variáveis Declaração de Variáveis = associação de um nome a um tipo de dado. Declaração de variável pode também associar outros atributos implicitamente. O escopo de uma declaração define a região do programa onde a declaração é aplicada, ou seja, onde a variável definida pela declaração é acessível. É indicado pela posição da declaração dentro do programa. Pode ser afetado por notações sintáticas explícitas e interações com outras declarações. O tempo de vida da declaração define a duração da alocação de memória para uma variável declarada. 11 Declaração de Variáveis Em C, todas as variáveis cuja as declarações são externas a funções são alocadas estaticamente e assim tem tempo de vida igual ao do programa principal. Em C, todas as variáveis que são declaradas dentro de funções são alocadas apenas para a duração de cada chamada de função (chamada, alocação automática). O C também permite para o tempo de vida de uma declaração dentro de uma função ser alterado de automática para estático através do uso da palavra reservada static na declaração, tal como: 12 2

de Variáveis Considerações sobre declaração de variáveis: int a, b [100]; => define a e b e aloca memória para eles. static int a, b [100]; => declara as variáveis locais para o procedimento, mas elas não são colocadas na pilha do procedimento. extern int a, b [100]; => informa o compilador que o ligador irá encontrar estas variáveis alocadas e inicializadas em outra parte do programa. register int x; => aloca a variável em um registro ao invés da memória. Regra de Escopo e Estrutura de Blocos As regras de escopo em linguagens de programação varia muito, entretanto existem alguns em comum, tais como: Declaração antes do uso Regra de aninhamento mais próximo para estrutura do bloco. 13 14 Declaração antes do Uso Estrutura de Blocos A declaração explícita antes do uso ajuda o programador a reduzir erros de referência de tipo. Isto simplifica a operação com a tabela de símbolos, pois torna mais fácil a detecção de variáveis que não foram declaradas. Ela também habilita uma compilação em uma única passada. Linguagem onde declaração explícita e antes do uso não são exigidas, não podem ser facilmente compiladas em um único passo. 15 Um bloco em uma linguagem de programação é qualquer construção que possa conter declarações. Ex: Em Pascal: Programa principal, declaração de procedimentos e funções e registros. Em C: Unidades de compilação (arquivos de código), declarações de procedimentos e funções, declarações compostas (como seqüências de declarações entre chaves), estruturas e uniões, Em linguagens orientadas a objetos: classes. 16 Estrutura de Blocos Uma linguagem é estruturada em blocos se: Permitir o aninhamento de blocos dentro de outros blocos. E se o escopo das declarações em um bloco for limitado a aquele bloco e aos blocos nele contidos. Regra do aninhamento mais próximo: dadas diversas declarações diferentes para o mesmo nome, a declaração que se aplica a uma referência é aquela no bloco de aninhamento mais próximo à referência. Exemplo 1 O int i não local não pode ser alcançado de dentro da declaração composta da função f, isso é chamado buraco de escopo. O int j não local pode ser alcançado de dentro da declaração composta da função f, mas não de dentro de um de seus dois blocos. Em Pascal as funções podem ser aninhadas, complicando o ambiente em tempo de execução. 17 18 3

Exemplo 2 Esse código Pascal reflete uma estrutura de tabela de símbolos que o exemplo 1. Entretanto, durante o tempo de execução um problema de acesso e escopo aparece, dado que f, g e h podem ser chamadas umas pelas outras de várias formas diferentes. Para implementar os escopo aninhado e a regra de aninhamento mais próximo, a operação inserir da tabela de símbolos não pode sobrescrever declarações anteriores, mas deve ocultá las temporariamente para que a operação verificar encontre apenas a declaração inserida mais recentemente. De maneira similar, a operação remover não pode remover todas as declarações que correspondam a um nome, mas apenas a mais recente. 19 20 A construção da tabela de símbolos pode acontecer a seguinte forma: Realize operações inserir para todos os nomes declarados ao entrar em cada bloco de código. Realize operações remover correspondentes para os mesmos nomes declarados ao sair de cada bloco. A tabela de símbolos se comporta como uma pilha durante o processamento de escopos aninhados. Uma implementação possível para escopo aninhado: Construir uma nova tabela de símbolos para cada escopo Vincular essas tabelas de escopo mais interno com o mais externo. Dessa forma, a operação verificar continua automaticamente a busca em uma tabela mais externa se não conseguir encontrar um nome na tabela corrente. Utilizando esta abordagem, abandonar o escopo requer menor esforço, pois as declarações não precisam ser removidas uma a uma. 21 22 Para a construção de tabelas diferentes para conter informações de escopos diferentes são necessárias duas novas operações: Abrir escopo: Deve ser executada sempre que se entra em um novo bloco. Seu resultado é a criação de uma nova tabela de símbolos para cada novo bloco e a colocação no topo da pilha. Fechar escopo: Executada sempre que se sai de um bloco. Sua função é apagar o conteúdo da tabela de símbolos do bloco e tirá la do topo da pilha. Utilizando a alternativa de implementar aninhamento de escopo em uma mesma tabela de símbolos. É necessária a identificação de cada espoco por um nome e o prefixo de cada nome declarado dentro de um escopo com os nomes acumulados de seus escopos aninhados. Adicionalmente, pode ser necessário atribuir um nível de aninhamento ou profundidade de aninhamento a cada escopo e registrar em cada célula da tabela de símbolos o nível de aninhamento de cada nome. 23 24 4

Um requisito típico das linguagens é a não reutilização do mesmo nome em declarações de mesmo nível. Portanto, o exemplo em C: Deve levar a um erro de compilação. Este erro é detectado utilizando a tabela de símbolos A tabela de símbolos não pode permitir que uma variável seja inserida mais de uma vez para um dado nível. 25 Uma questão mais difícil de se resolver é a seguinte: Qual é o valor impresso por j? 2 ou 3 O valor impresso por j é 3 porque as declarações não processadas seqüencialmente. Algumas ling. permitem declarações colaterais, nesse casso o valor de j é derivado do i externo, porque o i interno ainda não é conhecido. 26 Há também o caso das declarações recursivas, em que as declarações podem se auto referenciar ou referenciar outras declarações. Em casos mais complexos, pode se ter grupos de funções mutuamente exclusivas. Neste caso, uma declaração de protótipo de função é necessária para resolver o problema, tal como em C: Neste caso, o nome da função gcd deve ser adicionado a tabela de símbolos antes do corpo da função ser processado, senão a função não será conhecida quando o compilador encontrar a sua chamada recursiva. Essa declaração é vista como um modificador de escopo, que estende o escopo do nome g para incluir f. 27 28 5