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 ++.