Skip to content

Instantly share code, notes, and snippets.

@mateusmaso
Created February 18, 2013 00:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mateusmaso/4974359 to your computer and use it in GitHub Desktop.
Save mateusmaso/4974359 to your computer and use it in GitHub Desktop.
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