package Portugol.Language.Criar; import Portugol.Language.Analisador.Keyword; import Portugol.Language.Analisador.Simbolo; import Portugol.Language.Analisador.SymbolObjeto; import java.util.Vector; import Portugol.Language.Utilitario.LanguageException; import javax.swing.Icon; /** * @author Augusto Bilabila original de Antonio manso */ public class InstanciaSubrutine { public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera"; public static String ErroRecursividad = "Detectado llamado recursivo. CompAlg no permite este llamado"; static public Icon ClassSubrutineIcon; static public Icon GlobalSubrutineIcon; public Vector memory; public Vector paramsValues;//David: //public String TipoRetorno; public boolean EstaDebugeando; public SymbolObjeto InstanciaDono;//Se esta dentro duma classe, aqui temos a instancia actual public NodeInstruction NodeActual;//esto debe ser de metodo principal public NodeInstruction NodePrevio;//esto debe ser de metodo principal public BloqueSubrutine BloqueRutina; boolean esperarRetorno; public boolean EsConstructor; //public static String VerOperator = " " ;//im /** * Constroi um fluxograma * * @param code programa fonte * @throws Portugol.Language.Utils.LanguageException excepcao */ public InstanciaSubrutine(BloqueSubrutine bloqueRutina, SymbolObjeto ObjetoDono, Vector paramVals) throws LanguageException { // Construir(code); memory = new Vector(); NodeActual = bloqueRutina.getStartNode(); NodePrevio = null; BloqueRutina = bloqueRutina; InstanciaDono = ObjetoDono; paramsValues = paramVals; esperarRetorno = NodeActual.GetType() == Keyword.FUNCAO; EsConstructor = NodeActual.GetType() == Keyword.CONSTRUTOR; } //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- /** * limpa a memoria, os niveis de memoria. <br> * Utiliza-se no ciclo para limpar as variaveis <br> * locais ao ciclo. * * @param level nivel a partir do qual vai limpar */ protected static void cleanMemory(int level, Vector memory) {//sbr for (int index = memory.size() - 1; index >= 0; index--) { Simbolo v = (Simbolo) memory.get(index); //elimina as variaveis superiores ou iguais ao nivel if (v.getLevel() >= level) { memory.remove(index); } else { break; } } } //============================================================================= /** * string * * @return string */ public String toString() { StringBuffer str = new StringBuffer(); NodeInstruction pt = BloqueRutina.start; while (pt != null) { str.append(GetCode(pt)); pt = pt.next; } return str.toString(); } /** * calcula o texto de um nodo * * @param node nodo de origem * @return o texto de um nodo */ public static String GetCode(NodeInstruction node) {//im if (node.GetType() == Keyword.CONECTOR) { return ""; } if (node.GetType() == Keyword.SE) { return ExpandSe.toString(node); } if (node.GetType() == Keyword.ENQUANTO) { return ExpandEnquanto.toString(node); } return node.toString() + "\n"; } public Icon getIcon() { if (InstanciaDono != null) { return ClassSubrutineIcon; } else { return GlobalSubrutineIcon; } } public String getTextoDescriptor() { String res = EsConstructor ? "[NEW] " : (InstanciaDono != null ? "[" + InstanciaDono.getName() + "] " : ""); res += BloqueRutina.TipoRetorno == null || EsConstructor ? "" : BloqueRutina.TipoRetorno + " "; res += BloqueRutina.Nome; res += "("; for (int i = 0; i < BloqueRutina.parametrosDefinition.size(); i++) { res += i > 0 ? ", " : ""; res += BloqueRutina.parametrosDefinition.get(i).Tipo.toString(); res += " "; res += BloqueRutina.parametrosDefinition.get(i).Name; } res += BloqueRutina.parametrosDefinition.isEmpty() ? " " : ""; res += ")"; return res; } }