Created
February 18, 2013 00:24
-
-
Save mateusmaso/4974359 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package simbolos; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.List; | |
import gals.SemanticError; | |
import gals.Token; | |
import utils.Logger; | |
public class TabelaHashSimbolos implements TabelaSimbolos { | |
private HashMap<Integer, List<Simbolo>> tabelaSimbolos; | |
public TabelaHashSimbolos() { | |
Logger.LogLn("Criando tabela de simbolos"); | |
tabelaSimbolos = new HashMap<Integer, List<Simbolo>>(); | |
} | |
public Simbolo getAndRemoveSimbolo(Integer nivel, String nome) { | |
List<Simbolo> listaSimbolos = tabelaSimbolos.get(nivel); | |
if (listaSimbolos == null || listaSimbolos.size() == 0) { | |
Logger.LogLn("Não contem nada neste nivel de deslocamento, retornando null"); | |
return null; | |
} | |
Simbolo simbolo = buscaSimboloLista(listaSimbolos, nome); | |
if (simbolo != null) { | |
Logger.LogLn("Removendo simbolo " + nome + " no nivel " + nivel); | |
listaSimbolos.remove(simbolo); | |
Logger.LogLn("Símbolo removido com sucesso!"); | |
} | |
Logger.LogLn("Retornando simbolo."); | |
return simbolo; | |
} | |
public Simbolo getSimbolo(Integer nivel, String nome) { | |
if (!hasNivel(nivel)) { | |
return null; | |
} | |
return buscaSimboloLista(tabelaSimbolos.get(nivel), nome); | |
} | |
public boolean hasSimbolo(Integer nivel, Simbolo simbolo) { | |
if (!hasNivel(nivel)) { | |
return false; | |
} | |
List<Simbolo> listaSimbolos = tabelaSimbolos.get(nivel); | |
return buscaSimboloLista(listaSimbolos, simbolo.getNome()) != null; | |
} | |
public void putSimbolo(Integer nivel, Simbolo simbolo, Token token) throws SemanticError{ | |
Logger.LogLn(TabelaHashSimbolos.class, "Inserindo simbolo " + | |
simbolo.getNome() + " no nivel " + nivel); | |
//PEGAR TOKEN PRA SABER POSICAO DO ERRO... | |
if(!(simbolo instanceof IdPrograma)) | |
if(isProgramIdReservado(simbolo.getNome())) | |
throw new SemanticError("Identificador reservado " + token.getLexeme(), token.getPosition()); | |
List<Simbolo> listaSimbolos = tabelaSimbolos.get(nivel); | |
if (listaSimbolos == null) { | |
listaSimbolos = new ArrayList<Simbolo>(); | |
tabelaSimbolos.put(nivel, listaSimbolos); | |
} | |
removeSimbolo(nivel, simbolo.getNome()); | |
listaSimbolos.add(simbolo); | |
} | |
public void removeSimbolo(Integer nivel, String nome) { | |
getAndRemoveSimbolo(nivel, nome); | |
} | |
private Simbolo buscaSimboloLista(List<Simbolo> listaSimbolos, String nome) { | |
Logger.LogLn("Procurando simbolo de nome " + nome + " na lista de simbolos.."); | |
for (Simbolo s : listaSimbolos) { | |
if (s.getNome().equals(nome)) { | |
Logger.LogLn("Simbolo encontrado, retornando simbolo."); | |
return s; | |
} | |
} | |
Logger.LogLn("Simbolo não encontrado, retornando null."); | |
return null; | |
} | |
public boolean hasNivel(Integer nivel) { | |
List<Simbolo> listaSimbolos = tabelaSimbolos.get(nivel); | |
return listaSimbolos != null; | |
} | |
public void limparNivel(Integer nivel) { | |
limparNivel(nivel, null); | |
} | |
public void limparNivel(Integer nivel, Class[] classes) { | |
List<Simbolo> simboloRemovidos = new ArrayList<Simbolo>(); | |
Logger.LogLn("Iniciando procedimento para limpar nivel " + nivel); | |
if (classes == null || classes.length == 0) { | |
tabelaSimbolos.put(nivel, null); | |
} else { | |
List<Simbolo> listaSimbolos = tabelaSimbolos.get(nivel); | |
if (listaSimbolos != null) { | |
for (Simbolo simbolo : listaSimbolos) { | |
for (Class classe : classes) { | |
if (simbolo.getClass().equals(classe)) { | |
Logger.LogLn("Encontrou instancia de " + classe.getSimpleName() + " ser removida: " + simbolo.getNome()); | |
simboloRemovidos.add(simbolo); | |
} | |
} | |
} | |
listaSimbolos.removeAll(simboloRemovidos); | |
} | |
} | |
} | |
public Simbolo getSimboloIncluiNiveisInferiores(Integer nivel, String nome) { | |
Simbolo retorno = null; | |
for (int i = nivel; i >= 0; i--) { | |
if (hasNivel(i)) { | |
retorno = buscaSimboloLista(tabelaSimbolos.get(i), nome); | |
if (retorno != null) { | |
break; | |
} | |
} | |
} | |
return retorno; | |
} | |
public boolean isProgramIdReservado(String nome){ | |
return tabelaSimbolos.get(0).get(0).getNome().equals(nome); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment