Como construir um compilador utilizando ferramentas Java

Documentos relacionados
Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Palavras Reservadas da Linguagem Java

Compiladores Análise Semântica

Como construir um compilador utilizando ferramentas Java

Compiladores Análise Semântica

CAP. VI ANÁLISE SEMÂNTICA

Análise Semântica e Tratamento de Erros Dependentes de Contexto

Análise Semântica e Representação Intermédia

Linguagem de Programação III

Classes e Objetos. Sintaxe de classe em Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Linguagem Algorítmica OO. Linguagem Algorítmica

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Análise Semântica: Verificação de Tipos

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

Compiladores - JACC. Fabio Mascarenhas

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 31. Instituto de C

Listas Lineares Ordenadas

Compiladores. Análise Léxica

Compiladores Análise de Tipos

Detalhes da geração de código Usando a técnica ad hoc, amarrada aos procedimentos sintáticos, igual à análise semântica

Algoritmos II prof. Daniel Oliveira

Lição 7 Array em Java

Java Básico. Carga Horária: 32 horas. Pré-requisito: Lógica de Programação; JAVA. Conteúdo Programático

Linguagens de Programação Conceitos e Técnicas. Amarrações

Compiladores. Análise Semântica

Folha 4.2 Análise sintática ascendente

Como construir um compilador utilizando ferramentas Java

Variáveis primitivas e Controle de fluxo

Construção de um compilador para a linguagem Panda

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

4 Conceito de Herança

Compiladores Análise Semântica

Compilação da linguagem Panda

Linguagens de Programação Conceitos e Técnicas. Amarrações Prof. Tiago Alves de Oliveira

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

Programação II. Aula 3

Orientação a Objetos AULA 09

Arrays. Declaração e criação de arrays

Programação Orientada a Objetos II JAVA Décima Aula. Prof. Rogério Albuquerque de Almeida

Genéricos. Profa. Thienne Johnson EACH/USP

Diagramas Sintáticos

Array em Java. Figura 1 - Exemplo de um array de inteiros

Compiladores Análise de Tipos

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

Lembrando análise semântica. Compiladores. Implementação de esquemas de tradução L-atribuídos. Exemplo de implementação top-down (1)

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Computação II Orientação a Objetos

Como construir um compilador utilizando ferramentas Java

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

Compiladores - JFlex. Fabio Mascarenhas

Paradigmas de Programação

Análise Semântica e Representação Intermédia

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

Compiladores Análise de Tipos

Linguagem de Programação II Implementação

Programação Estruturada e Orientada a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Linguagem de Programação III

Como construir um compilador utilizando ferramentas Java

Tipos Abstratos de Dados. Estrutura de Dados

Programação de Computadores IV

Análise de Programação

Revisões de PG. Programação Orientada por Objetos (POO) Centro de Cálculo Instituto Superior de Engenharia de Lisboa

Folha 4.1 Análise sintática descendente

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Pseudolinguagem. BC0501 Linguagens de Programação t2 Aula 11. Prof. Alysson Ferrari ufabc.edu.br

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II Java Quinta aula

Compiladores Geração de Código

Declaração de Construtores em Java

Projeto de Linguagem. Linguagens de Programação

Erros de Tipo em Pascal Simplifificado

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

AULA 6 - ARRAYS. Array de 10 elementos

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Compiladores. Árvore de derivação anotada. Geração de TAC para as principais construções. tradução em código TAC de expressões

Interfaces POO. Prof. Marcio Delamaro

Nomes, Amarração, Verificação de Tipos, e Escopo

Sintaxe do Pascal Simplificado Estendido de 12 novas construções em Notação EBNF (BNF estendida)

Programação por Objectos. Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Transcrição:

Como construir um compilador utilizando ferramentas Java p. 1/3 Como construir um compilador utilizando ferramentas Java Aula 11 Tabela de Símbolos Prof. Márcio Delamaro delamaro@icmc.usp.br

Como construir um compilador utilizando ferramentas Java p. 2/3 Para que serve Guardar informação para cada nome que aparece no programa class firstclass extends secondclass {... } firstclass está sendo declarada como uma classe. firstclass y;

Como construir um compilador utilizando ferramentas Java p. 3/3 Para que serve int a, b, c; c = a * b; c = "abc"; firstclass y; c = y.atributo1;

Como construir um compilador utilizando ferramentas Java p. 4/3 O que armazenar? classes: nome, qual é a superclasse, quais são as variáveis dessa classe, quais são as classes aninhadas, quais são os métodos e construtores;

Como construir um compilador utilizando ferramentas Java p. 4/3 O que armazenar? classes: nome, qual é a superclasse, quais são as variáveis dessa classe, quais são as classes aninhadas, quais são os métodos e construtores; variáveis: nome, tipo, dimensão, se são locais ou não;

Como construir um compilador utilizando ferramentas Java p. 4/3 O que armazenar? classes: nome, qual é a superclasse, quais são as variáveis dessa classe, quais são as classes aninhadas, quais são os métodos e construtores; variáveis: nome, tipo, dimensão, se são locais ou não; métodos: nome, parâmetros, variáveis locais, tipo de retorno.

Como construir um compilador utilizando ferramentas Java p. 5/3 Como a tabela é usada: Ao declarar classe class firstclass extends secondclass... firstclass já foi declarada?

Como construir um compilador utilizando ferramentas Java p. 5/3 Como a tabela é usada: Ao declarar classe class firstclass extends secondclass... firstclass já foi declarada? secondclass é uma classe válida?

Como construir um compilador utilizando ferramentas Java p. 5/3 Como a tabela é usada: Ao declarar classe class firstclass extends secondclass... firstclass já foi declarada? secondclass é uma classe válida? secondclass pode ser usada como superclasse?

Como construir um compilador utilizando ferramentas Java p. 6/3 Ao declarar variável firstclass y; firstclass é um tipo ou classe válido?

Como construir um compilador utilizando ferramentas Java p. 6/3 Ao declarar variável firstclass y; firstclass é um tipo ou classe válido? y pode ser declarada nesse ponto?

Como construir um compilador utilizando ferramentas Java p. 7/3 Ao declarar método fisrtclass m(int k, secondclass s) firstclass é um tipo ou classe válido?

Como construir um compilador utilizando ferramentas Java p. 7/3 Ao declarar método fisrtclass m(int k, secondclass s) firstclass é um tipo ou classe válido? m pode ser declarado nesse ponto?

Como construir um compilador utilizando ferramentas Java p. 7/3 Ao declarar método fisrtclass m(int k, secondclass s) firstclass é um tipo ou classe válido? m pode ser declarado nesse ponto? seus parâmetros são legais?

Como construir um compilador utilizando ferramentas Java p. 8/3 Comandos x[i+9] = y.m(10, b) x é um array?

Como construir um compilador utilizando ferramentas Java p. 8/3 Comandos x[i+9] = y.m(10, b) x é um array? índice é do tipo correto?

Como construir um compilador utilizando ferramentas Java p. 8/3 Comandos x[i+9] = y.m(10, b) x é um array? índice é do tipo correto? classe de y possui o método m?

Como construir um compilador utilizando ferramentas Java p. 8/3 Comandos x[i+9] = y.m(10, b) x é um array? índice é do tipo correto? classe de y possui o método m? argumentos combinam com parâmetros formais?

Como construir um compilador utilizando ferramentas Java p. 8/3 Comandos x[i+9] = y.m(10, b) x é um array? índice é do tipo correto? classe de y possui o método m? argumentos combinam com parâmetros formais? dois lados da atribuição possuem tipos compatíveis?

Como construir um compilador utilizando ferramentas Java p. 9/3 Controle de escopo class classa { class classb { } int i; string m(classa x) { if ( x == null ) { int j; } } } class classc { }

Como construir um compilador utilizando ferramentas Java p. 10/3 Controle de escopo A classe classa pode ser utilizada em qualquer ponto dentro de si própria, incluindo em classb e dentro de classc.

Como construir um compilador utilizando ferramentas Java p. 10/3 Controle de escopo A classe classa pode ser utilizada em qualquer ponto dentro de si própria, incluindo em classb e dentro de classc. A classe classb não pode ser utilizada dentro de classc.

Como construir um compilador utilizando ferramentas Java p. 10/3 Controle de escopo A classe classa pode ser utilizada em qualquer ponto dentro de si própria, incluindo em classb e dentro de classc. A classe classb não pode ser utilizada dentro de classc. A variável i pode ser utilizada dentro de classa (excluindo classb), mas não dentro de classc.

Como construir um compilador utilizando ferramentas Java p. 10/3 Controle de escopo A classe classa pode ser utilizada em qualquer ponto dentro de si própria, incluindo em classb e dentro de classc. A classe classb não pode ser utilizada dentro de classc. A variável i pode ser utilizada dentro de classa (excluindo classb), mas não dentro de classc. A variável x é local a m.

Como construir um compilador utilizando ferramentas Java p. 10/3 Controle de escopo A classe classa pode ser utilizada em qualquer ponto dentro de si própria, incluindo em classb e dentro de classc. A classe classb não pode ser utilizada dentro de classc. A variável i pode ser utilizada dentro de classa (excluindo classb), mas não dentro de classc. A variável x é local a m. j é local ao comando if.

Como construir um compilador utilizando ferramentas Java p. 11/3 A tabela para X ++ class firstclass { } class secondclass { } class thirdclass { } 0 1 2 firstclass secondclass thirdclass

Como construir um compilador utilizando ferramentas Java p. 12/3 A tabela de símbolose a árvore sintática Assim como no programa que exibe a árvore sintática, temos um programa que analisa a árvore e vai montando a tabela de símbolos. Esse programa, ao analisar o nó número 2, deve inserir na tabela o identificador firstclass, ao analisar o nó 6, deve incluir secondclass e, ao analisar o nó 10, deve inserir thirdclass. (1)ListNode (2)ClassDeclNode (5)ListNode (3)Token: firstclass (4)ClassBodyNode (6)ClassDeclNode (9)ListNode (7)Token: secondclass (8)ClassBodyNode (10)ClassDeclNode (11)Token: thirdclass (12)ClassBodyNode

Como construir um compilador utilizando ferramentas Java p. 13/3 O conteúdo de uma classe Cada entrada de Symtable deve descrever uma classe.

Como construir um compilador utilizando ferramentas Java p. 13/3 O conteúdo de uma classe Cada entrada de Symtable deve descrever uma classe. Nome da classe, nome da superclasse.

Como construir um compilador utilizando ferramentas Java p. 13/3 O conteúdo de uma classe Cada entrada de Symtable deve descrever uma classe. Nome da classe, nome da superclasse. Variáveis, construtores, métodos e classes aninhadas.

Como construir um compilador utilizando ferramentas Java p. 13/3 O conteúdo de uma classe Cada entrada de Symtable deve descrever uma classe. Nome da classe, nome da superclasse. Variáveis, construtores, métodos e classes aninhadas. A cada entrada associa-se uma outra Symtable

Como construir um compilador utilizando ferramentas Java p. 14/3 Por exemplo class secondclass { class sec2 { class sec3 { } } int secvar1, secvar2[]; firstclass secvar3; thirdclass [][] secmeth1(); }

Como construir um compilador utilizando ferramentas Java p. 15/3 Resulta na tabela 0 firstclass Symtable para firstclass sec2 secvar1 sec3 Symtable para sec3 1 2 secondclass thirdclass Symtable secvar2 secvar3 secmeth1 para thirdclass

Como construir um compilador utilizando ferramentas Java p. 15/3 Resulta na tabela 0 firstclass Symtable para firstclass sec2 secvar1 sec3 Symtable para sec3 1 2 secondclass thirdclass Symtable secvar2 secvar3 secmeth1 para thirdclass Escopo: variável em sec2 pode usar sec2, sec3, secondclass, firstclass ou thirdclass; não pode usar classe aninhada a firstclass. secondclass não pode utilizar sec3.

Como construir um compilador utilizando ferramentas Java p. 16/3 Símbolo locais O comportamento e escopo de classes, métodos, construtores e variáveis de classe são, de certa forma, estáticos.

Como construir um compilador utilizando ferramentas Java p. 16/3 Símbolo locais O comportamento e escopo de classes, métodos, construtores e variáveis de classe são, de certa forma, estáticos. As variáveis locais dos métodos têm comportamento volátil.

Como construir um compilador utilizando ferramentas Java p. 16/3 Símbolo locais O comportamento e escopo de classes, métodos, construtores e variáveis de classe são, de certa forma, estáticos. As variáveis locais dos métodos têm comportamento volátil. Só podem ser usadas dentro do método em que foram definidas ou, ainda, dentro do bloco onde foram definidas.

Como construir um compilador utilizando ferramentas Java p. 16/3 Símbolo locais O comportamento e escopo de classes, métodos, construtores e variáveis de classe são, de certa forma, estáticos. As variáveis locais dos métodos têm comportamento volátil. Só podem ser usadas dentro do método em que foram definidas ou, ainda, dentro do bloco onde foram definidas. Ao iniciar a análise de um método ou um bloco, o analisador deve marcar quais as variáveis que foram definidas até aquele ponto.

Como construir um compilador utilizando ferramentas Java p. 16/3 Símbolo locais O comportamento e escopo de classes, métodos, construtores e variáveis de classe são, de certa forma, estáticos. As variáveis locais dos métodos têm comportamento volátil. Só podem ser usadas dentro do método em que foram definidas ou, ainda, dentro do bloco onde foram definidas. Ao iniciar a análise de um método ou um bloco, o analisador deve marcar quais as variáveis que foram definidas até aquele ponto. Ao terminar a análise desse bloco o analisador deve tirar da tabela aquelas variáveis declaradas dentro do bloco.

Como construir um compilador utilizando ferramentas Java p. 17/3 Por exemplo thirdclass[][] secmeth1() { int i,j; { string s; } } MethodDeclNode Token: thirdclass 2 MethodBodyNode BlockNode ListNode VarDeclNode ListNode Token: int ListNode BlockNode VarNode ListNode ListNode Token: i 0 VarNode VarDeclNode Token: j 0 Token: string ListNode VarNode Token: s 0

Como construir um compilador utilizando ferramentas Java p. 18/3 Por exemplo thirdclass[][] secmeth1() { int i,j; { string s; } } i = j + s; MethodDeclNode Token: thirdclass 2 MethodBodyNode BlockNode ListNode VarDeclNode ListNode Token: int ListNode BlockNode ListNode VarNode ListNode ListNode AtribNode Token: i 0 VarNode VarDeclNode Token: j 0 Token: string ListNode VarNode Token: s 0

Como construir um compilador utilizando ferramentas Java p. 19/3 Gera a tabela sec2 sec2 secvar1 secvar1 secvar2 secvar2 secvar3 (a) secvar3 (b) secmeth1 secmeth1 i j sec2 secvar1 secvar2 secvar3 (c) secmeth1 i j s

Como construir um compilador utilizando ferramentas Java p. 20/3 Observações cada entrada da Symtable pode representar tipos diferentes de identificadores.

Como construir um compilador utilizando ferramentas Java p. 20/3 Observações cada entrada da Symtable pode representar tipos diferentes de identificadores. Descritor de uma classe, de um construtor, de um método ou de uma variável.

Como construir um compilador utilizando ferramentas Java p. 20/3 Observações cada entrada da Symtable pode representar tipos diferentes de identificadores. Descritor de uma classe, de um construtor, de um método ou de uma variável. Para cada um desses descritores, o tipo de informação que se armazena é diferente.

Como construir um compilador utilizando ferramentas Java p. 21/3 Implementação: Symtable Pacote symtable

Como construir um compilador utilizando ferramentas Java p. 21/3 Implementação: Symtable Pacote symtable Lista ligada

Como construir um compilador utilizando ferramentas Java p. 21/3 Implementação: Symtable Pacote symtable Lista ligada Política de pilha

Como construir um compilador utilizando ferramentas Java p. 21/3 Implementação: Symtable Pacote symtable Lista ligada Política de pilha Variáveis: top, scptr, levelup

Como construir um compilador utilizando ferramentas Java p. 21/3 Implementação: Symtable Pacote symtable Lista ligada Política de pilha Variáveis: top, scptr, levelup Dois construtores

Como construir um compilador utilizando ferramentas Java p. 21/3 Implementação: Symtable Pacote symtable Lista ligada Política de pilha Variáveis: top, scptr, levelup Dois construtores Add, beginscope, endscope

Como construir um compilador utilizando ferramentas Java p. 22/3 Variáveis top aponta para a cabeça da lista. scptr é um número inteiro que controla o aninhamento de blocos. Inicialmente seu valor é 0 e a cada novo bloco esse valor é incrementado. Cada variável guarda o valor de scptr quando inserida na tabela, assim é possível saber a qual bloco ela pertence. levelup aponta para uma entrada em outra Symtable. Ela possibilita identificar a qual classe essa tabela pertence.

Como construir um compilador utilizando ferramentas Java p. 23/3 Visão Symtable (1) EntryTable EntryTable (3) (2) Symtable (1) EntryTable EntryTable EntryTable

Como construir um compilador utilizando ferramentas Java p. 24/3 Construtores Um cria uma tabela vazia. Outro, cria uma tabela vazia, que aponta para a entrada que a possui. public Symtable(EntryClass up) { top = null; scptr = 0; levelup = up; }

Como construir um compilador utilizando ferramentas Java p. 25/3 EntryTable Todo elementa da Symtable é do tipo EntryTable. É uma classe abstrata.

Como construir um compilador utilizando ferramentas Java p. 25/3 EntryTable Todo elementa da Symtable é do tipo EntryTable. É uma classe abstrata. package symtable; // classe geral para as possíveis entradas na tabela de símbolo abstract public class EntryTable { public String name; // nome do símbolo (var., método ou classe) public EntryTable next; // apontador para próximo dentro da tabela public int scope; // número do aninhamento corrente public Symtable mytable; // aponta para a tabela da qual ela é parte }

Como construir um compilador utilizando ferramentas Java p. 26/3 EntryClass public class EntryClass extends EntryTable { public Symtable nested; // tabela p/ declaração de elementos aninhados public EntryClass parent; // entrada correspondente à superclasse public EntryClass(String n, Symtable t) { name = n; // nome da classe declarada nested = new Symtable(this); // tabela onde inserir variáveis, // métodos ou classes parent = null; // sua superclasse } }

Como construir um compilador utilizando ferramentas Java p. 27/3 Entryvar public class EntryVar extends EntryTable { public EntryTable type; // apontador para o tipo da variável public int dim; // número de dimensões da variável public int localcount; // numeração seqüencial para locais // cria uma entrada para var. de classe public EntryVar(String n, EntryTable p, int d) { name = n; // nome da variável type = p; // apontador para a classe dim = d; // número de dimensões localcount = -1; // número seqüencial é sempre -1 (não local) } // cria uma entrada para var.local public EntryVar(String n, EntryTable p, int d, int k) { this(n, p, d); localcount = k; // inclui também o número seqüencial } }

Como construir um compilador utilizando ferramentas Java p. 28/3 EntryMethod public class EntryMethod extends EntryTable { public EntryTable type; // tipo de retorno do método public int dim; // número de dimensões do retorno public EntryRec param; // tipo dos parâmetros public int totallocals; // número de variáveis locais public int totalstack; // tamanho da pilha necessária public boolean fake; // true, se é um falso construtor public boolean hassuper; // true, se método possui chamada super // cria elemento para inserir na tabela public EntryMethod(String n, EntryTable p, int d, EntryRec r) { name = n; type = p; dim = d; param = r; totallocals = 0; totalstack = 0; fake = false; hassuper = false; }

Como construir um compilador utilizando ferramentas Java p. 29/3 EntryMethod public EntryMethod(String n, EntryTable p, boolean b) { name = n; type = p; dim = 0; param = null; totallocals = 0; totalstack = 0; fake = b; hassuper = false; } }

Como construir um compilador utilizando ferramentas Java p. 30/3 EntryRec public class EntryRec extends EntryTable { public EntryTable type; // tipo de um objeto public int dim; // dimensão public EntryRec next; // apontador para o resto da lista public int cont; // número de elementos a partir daquele elemento // cria elemento public EntryRec(EntryTable p, int d, int c) { type = p; cont = c; dim = d; next = null; } // cria elemento e põe no início da lista public EntryRec(EntryTable p, int d, int c, EntryRec t) { this(p, d, c); next = t; } }

Como construir um compilador utilizando ferramentas Java p. 31/3 EntrySimple package symtable; // entrada utilizada para declarar os tipos // básicos da linguagem public class EntrySimple extends EntryTable { public EntrySimple(String n) { name = n; } }

Como construir um compilador utilizando ferramentas Java p. 32/3 Outros métodos Essas classes possuem diversos métodos que auxiliam na manipulação da tabela de símbolos. Em particular, métodos de busca de símbolos. Eles serão estudados durante a análise semântica. Fica registrado que eles respeitam a estrutura do programa, implementando a política de escopos definida pela linguagem X ++.