Prof. Heloise Manica Paris Teixeira

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Linguagem PASCAL Subprogramas
gerador de código intermediário
Conteúdo: - Atribuição de Valores a Variáveis.
Software Básico Silvio Fernandes
Compiladores Prof. Yandre Maldonado Compiladores - Prof. Yandre - 1.
Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.
Análise Sintática - Continuação
Introdução a Informática
Introdução à Programação Pascal - Começando Prof. Filipo Studzinski Perotto 2009.
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
Algoritmos e Estruturas de Dados II
Aula 4 Nomes, Vinculações, Tipos e Escopos
Prof. Msc. Raul Paradeda Aula 3 Fundamentos
Robson Godoi / Sandra Siebra
Revisão da Linguagem C.
Algoritmos e Programação
Paradigmas de programação
João Lucas de Oliveira Torres
Análise Semântica e Representação Intermédia
Variáveis, Tipos de Dados e Constantes
Aula prática - análise contextual
Linguagem de Programação II Parte IX
Introdução a Programação COM 100 Aula 07 Procedimentos.
Eric, Fabrício, João Vicente
Introdução a Programação
Introdução ao uso de vatores na linguagem PASCAL.
Verificação de Tipos e Escopos
Estudo dos Conceitos e Paradigmas de Programação
Paradigmas de Linguagens de Programação Linguagem Imperativa 2
Semântica de Linguagens de Programação
Paradigmas de Linguagens de Programação Linguagem Imperativa 1
Geração de Código Intermediário
Análise Léxica Primeira fase de um compilador
Modelos de Paradigmas de programação
Análise Léxica.
Capítulo III Modularização Procedimentos e Funções Universidade Federal de São Carlos Departamento de Computação Aluna: Luanna Lopes Lobato
Linguagem Pascal Prof. Sérgio Rodrigues.
Capítulo II Gramáticas e Linguagens
Lógica Estruturada Aplicada
Geração de Código aula-12-geração-de-código.pdf.
Capítulo VIII Ambientes de Execução
Analise Semântica aula-10-analise-semântica.pdf.
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Projeto de Linguagens de Programação
VARIÁVEIS COMPOSTAS HOMOGÊNEAS UNIDIMENSIONAIS (VETORES)
Vetores Bidimensionais – Debug - Ponteiros – Listas Encadeadas Simples
Tradução Dirigida por Sintaxe
Back-End Compilação aula-11-back-end.pdf.
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.
Uma Infraestrutura para a
Fundamentos de linguagens de programação
Semântica de Linguagens de Programação
Programação de Computadores - 1
Introdução à Programação
Paradigmas de Linguagens de Programação Conceitos da Linguagem Imperativa 1 Augusto Sampaio e Paulo Borba Centro de Informática Universidade Federal de.
SISTEMAS DE INFORMAÇÃO
Faculdade Pernambuca - FAPE
Linguagem de Programação I Parte IV
Análise Semântica e Representação Intermédia
11 Revisão da Linguagem C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
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.
MATA56 Tipos, Verificação de Tipos Agenda Objetivo desta aula: Introduzir os principais aspectos semânticos de variáveis Palavras-chave – nomes.
Análise Contextual Mauro Araújo Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco.
Transcrição da apresentação:

Prof. Heloise Manica Paris Teixeira Análise Semântica Prof. Heloise Manica Paris Teixeira Orginais:Profa. Valéria D. Feltrim - DIN – UEM Este material foi gentilmente cedido pelo Prof. Thiago A. S. Pardo, ICMC-USP/São Carlos

Estrutura geral de um compilador programa-fonte analisador léxico Tabela de símbolos analisador sintático analisador semântico Manipulação de erros Tabela de palavras e símbolos reservados gerador de código intermediário otimizador de código gerador de código programa-alvo dados de entrada saída

Análise semântica Função: verificação do uso adequado Análise contextual: declarações prévias de variáveis, procedimentos, etc. Checagem de tipos Coisas que vão além do domínio da sintaxe Sensitividade ao contexto! Tipos de análise semântica Estática, em tempo de compilação: linguagens tipadas, que exigem declarações C, Pascal, etc. Dinâmica, em tempo de execução: linguagens em que as variáveis são determinadas pelo contexto de uso LISP, PROLOG

Análise semântica Devido às variações de especificação semântica das linguagens de programação, a análise semântica Não é tão bem formalizada Não existe um método ou modelo padrão de representação do conhecimento Não existe um mapeamento claro da representação para o algoritmo correspondente Análise é artesanal, dependente da linguagem de programação

Análise semântica Semântica dirigida pela sintaxe Conteúdo semântico fortemente relacionado à sintaxe do programa Maioria das linguagens de programação modernas Em geral, a semântica de uma linguagem de programação não é especificada O projetista do compilador tem que analisar e extrair a semântica

Análise semântica Em geral, a gramática de atributos de uma gramática especifica Comportamento semântico das operações Checagem de tipos Manipulação de erros Tradução do programa Tabela de símbolos: estrutura essencial para a análise semântica

Tabela de símbolos Captura a sensitividade ao contexto e as ações executadas no decorrer do programa Atrelada a todas as etapas da compilação Permite a realização da análise semântica Fundamental na geração de código

Tabela de símbolos Permite saber durante a compilação de um programa o tipo e o valor de seus elementos (números e identificadores), escopo destes, número e tipo dos parâmetros de um procedimento, etc. Cada token tem atributos/informações diferentes associadas Cadeia Token Categoria Tipo Valor ... i id var integer 1 fat proc - 2 num

Tabela de símbolos Exemplo de atributos de identificador de variável Tipo de variável (inteira, real, etc.), nome da variável, endereço na memória, escopo (global, local, etc.), etc. Para vetores, ainda seriam necessários atributos de tamanho do vetor, o valor de seus limites, etc.

Tabela de símbolos Principais operações efetuadas Inserir: armazena na tabela informações fornecidas pelas declarações no programa Busca: recupera da tabela informações de um elemento declarado no programa quando esse elemento é utilizado Remover: remove (ou torna inacessível) da tabela informações sobre um elemento declarado que não se mostra mais necessário no programa As especificidades dessas operações são dependentes da linguagem de programação em questão

Tabela de símbolos A tabela é acessada pelo compilador sempre que um elemento é mencionado no programa Verificar ou incluir sua declaração Verificar seu tipo, seu escopo ou alguma outra informação Atualizar alguma informação associada ao identificador (p.e., valor) Remover um elemento quando este não se faz mais necessário ao programa

Tabela de símbolos Implementação Estrutura Estrutura da tabela de símbolos: determinada pela eficiência das operações de inserir, verificar e remover Várias possibilidades Implementação Estática Dinâmica (Melhor opção) Estrutura Listas lineares Árvores de busca (por exemplo, B e AVL) Hashing

Tabela de símbolos Questões de projeto Tamanho da tabela: tipicamente, de algumas centenas a mil campos Dependente da forma de implementação Na implementação dinâmica, não é necessário se preocupar com isso Uma única tabela para todas as declarações ou várias tabelas, sendo uma para cada tipo de declaração (constantes, variáveis, tipos, procedimentos e funções) Diferentes declarações têm diferentes informações/atributos por exemplo, variáveis não têm número de argumentos, enquanto procedimentos têm

Tabela de símbolos Representação de escopo de identificadores do programa Várias tabelas ou uma única tabela com a identificação do escopo (como um atributo) para cada identificador Tratamento de escopo Inserção de identificadores de mesmo nome, mas em níveis diferentes Remoção de identificadores cujos escopos deixaram de existir A tabela de símbolos pode ser utilizada para armazenar as palavras reservadas e símbolos especiais da linguagem, podendo dispensar o uso da tabela de palavras e símbolos reservados

Tabela de símbolos Descritores Registros (campos) que formam a tabela de símbolos Diferentes identificadores têm diferentes descritores Tem que se levar isso em consideração no projeto da tabela de símbolos para sua otimização

Tabela de símbolos Inserção de elementos na tabela Associação de regras semânticas às regras gramaticais Verificar se o elemento já não consta na tabela Busca de informação na tabela Realizada antes da inserção Busca de informações para análise semântica Remoção de elementos da tabela Tornar inacessíveis dados que não são mais necessários por exemplo, após o escopo ter terminado Linguagens que permitem estruturação em blocos

Tabela de símbolos Inserção de elementos na tabela Declaração, principalmente programa program id corpo . inserir(cadeia,token=“id”,cat=”nome_prog”) program meu_prog ... Cadeia Token Categoria Tipo Valor ... meu_prog id nome_prog -

Tabela de símbolos inserir(tipo=“real”) Obs: não esta sendo ilustrado o controle das posições na tabela! inserir(tipo=“real”) inserir(cadeia,token=“id”,cat=”var”) declaração de variáveis var id : real integer , inserir(tipo=“integer”) var x, y: integer Cadeia Token Categoria Tipo Valor ... meu_prog id nome_prog - x var integer y

Tabela de símbolos Exercício: inclua as funções adequadas Obs: não esta sendo ilustrado o controle das posições na tabela! Exercício: inclua as funções adequadas procedure meu_proc(a: integer; b,c: real) ... declaração de procedimentos procedure id ( id : real ) corpo integer , ;

Tabela de símbolos Exercício: inclua as funções adequadas Obs: não esta sendo ilustrado o controle das posições na tablea! Exercício: inclua as funções adequadas declaração de procedimentos procedure meu_proc(a: integer; b,c: real) ... procedure id ( id : real ) corpo integer , ; inserir(cadeia,token=“id”,cat=”proc”) Cadeia Token Categoria Tipo Valor ... meu_proc id proc -

Tabela de símbolos Exercício: inclua as funções adequadas Obs: não esta sendo ilustrado o controle das posições na tabela! Exercício: inclua as funções adequadas inserir(tipo=“real”) a partir de... procedure meu_proc(a: integer; b,c: real) ... declaração de procedimentos inserir(cadeia,token=“id”,cat=”par”) procedure id ( id : real ) corpo integer , ; inserir(cadeia,token=“id”,cat=”proc”) inserir(tipo=“integer”) a partir de...

Tabela de símbolos Exercício: inclua as funções adequadas procedure meu_proc(a: integer; b,c: real) ... Cadeia Token Categoria Tipo Valor ... meu_prog id nome_prog - x var integer y meu_proc proc a par b real c

Tabela de símbolos Tratamento de escopo Como diferenciar variáveis globais de locais Tratamento de variáveis de mesmo nome, mas de escopos diferentes program meu_prog var x, y: integer procedure meu_proc(x: integer) var y: real begin read(y); x:=x+y end; x:=x*y end.

Tabela de símbolos Busca de informação Possibilidades para tratamento de escopos Inclusão de um campo a mais na tabela de símbolos indicando o nível da variável no programa Tabelas diferentes para diferentes escopos Busca de informação Sempre que um elemento do programa é utilizado comando e fator Verifica-se se foi declarado, seu tipo, etc.

Tabela de símbolos busca(cadeia,token=“id”,cat=“var”) fator id número real número inteiro ( expressão )

Tabela de símbolos busca(cadeia,token=“id”, cat=“var”) comando read ( write , id := expressão busca(cadeia,token=“id”,cat=“var”) ( id ) ; busca(cadeia,token=“id”,cat=“par”) busca(cadeia,token=“id”,cat=“proc”)

Tratamento semântico Verificação do uso adequado dos elementos do programa Declaração de identificadores Erro: identificador não declarado ou declarado duas vezes Compatibilidade de tipos em comandos Checagem de tipos Concordância entre parâmetros formais e atuais, em termos de número, ordem e tipo

Tratamento semântico Declaração de identificadores Verificado durante a construção da tabela de símbolos Compatibilidade de tipos Dependente do contexto Atribuição: inteiro:=inteiro, real:=inteiro, string:=cadeia de caracteres Erro: inteiro:=real Comandos de repetição: while booleano do..., if booleano then... Expressões e tipos esperados pelos operadores: inteiro+inteiro, real*real, inteiro+real, inteiro/inteiro, booleano and booleano Erro: inteiro+booleano Arrays: vetor[integer]

Tratamento semântico Concordância entre parâmetros formais e atuais, em termos de número, ordem e tipo Por exemplo, se declarado: procedure p(var x: integer; var y: real) Erros procedure p(x:integer, y:integer) procedure p(y:real, x:integer) procedure p(x:integer) Tratamento de escopo Erro: variável local a um procedimento utilizada no programa principal