コード例 #1
0
 /** 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;
 }
コード例 #2
0
  /** 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;
  }
コード例 #3
0
  // 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;
  }
コード例 #4
0
 /** Diz se classe foi criada. */
 public boolean existeClass(String clas) {
   SymbolTuple sym = table.getSymbolTuple(clas, "Global");
   return sym != null && sym.getType().equalsIgnoreCase("Class");
 }