/** Caso haja uma superclasse ele retorna o seu nome. */ public String getSuperClass(String cls) { String superClasse = null; String classeAtual = null; if (cls == null) { if (getScope().size() == 3) classeAtual = getScope().get(getScope().size() - 2); } else { classeAtual = cls; } SymbolTuple symClasseAtual = table.getSymbolTuple(classeAtual, "Global"); if (symClasseAtual != null) superClasse = symClasseAtual.getArg(); return superClasse; }
/** Verifica o tipo do Identifier cujo valor eh a string n. */ public String typeOf( String n, int line) { // Verificar na tabela do mehtodo, na da classe e na superclasse o tipo de // expressao. SymbolTuple inMetodo = table.getSymbolTuple(n, Scope()); // No mehtodo SymbolTuple inClasse = table.getSymbolTuple(n, ScopeClass()); // Na classe. String superClasse = getSuperClass(null); // Nome da superclasse. SymbolTuple inSuperClasse = null; if (superClasse != null) inSuperClasse = table.getSymbolTuple(n, "Global" + superClasse); // Na superclasse. if (inMetodo != null) { return inMetodo.getType(); } else { if (inClasse != null) return inClasse.getType(); else if (inSuperClasse != null) return inSuperClasse.getType(); } error.add("Variavel \"" + n + "\" nao definida. Linha: " + line); return null; }
// Exp e; // Identifier i; // ExpList el; public Object visit(Call n) { // Implenetada, mas gambiarral. Se der tempo eu ajeito. Object ep = n.e.accept(this); n.i.accept(this); List<String> pars = new ArrayList<String>(); // Lista de tipos de parâmetros. for (int i = 0; i < n.el.size(); i++) { Object ep1 = n.el.get(i).accept(this); if (ep1 instanceof String) { pars.add((String) ep1); } } if (ep instanceof String) { String clas = (String) ep; if (existeClass(clas)) { List<SymbolTuple> listscop = table.getTable().get("Global" + clas); for (SymbolTuple sym : listscop) { if (sym.getType().equalsIgnoreCase("Method") && sym.getValue().equalsIgnoreCase(n.i.s)) { if (sym.getPars() == null && pars.size() == 0) return sym.getArg(); else { if (sym.getPars() != null && sym.getPars().size() == pars.size()) { for (int i = 0; i < pars.size(); i++) { String sup2 = getSuperClass(pars.get(i)); boolean valida = !(sym.getPars().get(i).equalsIgnoreCase(pars.get(i)) || sym.getPars().get(i).equalsIgnoreCase(sup2)); // Tratar a heranca. if (valida) { error.add("Lista de parâmetros incompativeis! Linha: " + n.getLine_number()); return null; } } return sym.getArg(); } else error.add("Lista de parâmetros incompativeis-----! Linha: " + n.getLine_number()); } } } if (getSuperClass(clas) != null && existeClass(getSuperClass(clas))) { // Na superclasse List<SymbolTuple> listscop2 = table.getTable().get("Global" + getSuperClass(clas)); for (SymbolTuple sym : listscop2) { if (sym.getType().equalsIgnoreCase("Method") && sym.getValue().equalsIgnoreCase(n.i.s)) { if (sym.getPars() == null && pars.size() == 0) return sym.getArg(); else { if (sym.getPars() != null && sym.getPars().size() == pars.size()) { for (int i = 0; i < pars.size(); i++) { String sup2 = getSuperClass(pars.get(i)); boolean valida = !(sym.getPars().get(i).equalsIgnoreCase(pars.get(i)) || sym.getPars().get(i).equalsIgnoreCase(sup2)); // Tratar a heranca. if (valida) { error.add("Lista de parâmetros incompativeis! Linha: " + n.getLine_number()); return null; } } return sym.getArg(); } else error.add("Lista de parâmetros incompativeis-----! Linha: " + n.getLine_number()); } } } } error.add("Mehtodo nao existe! Linha: " + n.getLine_number()); } else error.add("Classe nao existe! Linha: " + n.getLine_number()); } return null; }
/** Diz se classe foi criada. */ public boolean existeClass(String clas) { SymbolTuple sym = table.getSymbolTuple(clas, "Global"); return sym != null && sym.getType().equalsIgnoreCase("Class"); }