private String GenerarMetodo() { String cadena = ""; FMetodo metodo = (FMetodo)Valor; cadena += metodo.Generar3D(); return(cadena); }
private String GenerarConstructor() { String cadena = ""; FMetodo constructor = (FMetodo)Valor; cadena += constructor.Generar3DConstructor(); return(cadena); }
private String GenerarRetornar() { String cadena = ""; Nodo3D val = ((FNodoExpresion)Valor).Generar3D(); Simbolo metodopadre = BuscarMetodoPadre(); FMetodo met = (FMetodo)metodopadre.Valor; String tipometodo = metodopadre.Tipo; if (met.Dimensiones > 0) { tipometodo = "arreglo " + tipometodo; } if (val.Tipo.Equals(Constante.TBooleano)) { if (val.V == "" && val.F == "") {//si trae etiquetas viene de una relacional si no es un bool nativo } else { var cad = ""; var auxtemp = TitusTools.GetTemp(); var salida = TitusTools.GetEtq(); cad += "\t" + val.V + ":\n"; cad += "\t\t" + auxtemp + " = 1;\n"; cad += "\t\t" + "goto " + salida + ";\n"; cad += "\t" + val.F + ":\n"; cad += "\t\t" + auxtemp + " = 0;\n"; cad += "\t" + salida + ":\n"; val.Valor = auxtemp; cad += "\t\t" + val.Valor + " = - " + auxtemp + ";\n"; val.Codigo = val.Codigo + cad; } } if (tipometodo.Equals(val.Tipo)) { String retorno = TitusTools.GetTemp(); cadena += val.Codigo; cadena += "\t\t" + retorno + " = P + 1;//Posicion de retorno\n"; cadena += "\t\t" + "Stack[" + retorno + "] = " + val.Valor + ";//Asignacion de retorno\n"; cadena += "\t\t§retornar§;\n"; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "El metodo " + met.Nombre + " solo puede retornar un tipo " + tipometodo + ", no un tipo " + val.Tipo, TitusTools.GetRuta(), Fila, Columna); } return(cadena); }
public Simbolo BuscarMetodo(String nombre, List <Nodo3D> parametros) { Simbolo padreclase = BuscarClasePadre(); Boolean encontrado = false; foreach (Simbolo sim in padreclase.Ambito.TablaSimbolo) { if ((sim.Rol.Equals(Constante.TMetodo) || sim.Rol.Equals(Constante.TFuncion)) && sim.Nombre.Equals(nombre)) { FMetodo metodo = (FMetodo)sim.Valor; if (metodo.Parametros.Count == parametros.Count) { Boolean error = false; for (int i = 0; i < metodo.Parametros.Count; i++) { FParametro p = (FParametro)metodo.Parametros[i].Valor; String tipometodo = p.Tipo; String tipoparametro = parametros[i].Tipo; if (p.Dimensiones > 0) { tipometodo = "arreglo " + tipometodo; } if (!tipometodo.Equals(tipoparametro)) { error = true; break; } } if (!error) { return(new Simbolo(sim)); } } } } if (!encontrado) { Simbolo here = BuscarMetodoHerencia(nombre, parametros); if (here != null) { Simbolo nuevo = new Simbolo(here); nuevo.este += padreclase.Ambito.Tamaño; here = nuevo; } return(here); } return(null); }
public Simbolo BuscarConstructor(String nombreClase, List <Nodo3D> parametros) { Simbolo padreclase = BuscarClasePadre(); FClase pc = (FClase)padreclase.Valor; Simbolo clase = BuscarClase(nombreClase, pc.ArchivoPadre); if (clase != null) { Boolean encontrado = false; foreach (Simbolo c in clase.Ambito.TablaSimbolo) { if (c.Rol.Equals(Constante.TConstructor) && !encontrado) { FMetodo metodo = (FMetodo)c.Valor; if (metodo.Parametros.Count == parametros.Count) { Boolean error = false; for (int i = 0; i < metodo.Parametros.Count; i++) { FParametro p = (FParametro)metodo.Parametros[i].Valor; String tipometodo = p.Tipo; String tipoparametro = parametros[i].Tipo; if (p.Dimensiones > 0) { tipometodo = "arreglo " + tipometodo; } if (!tipometodo.Equals(tipoparametro)) { error = true; break; } } if (!error) { return(c); } } } } if (!encontrado) { FMetodo m = new FMetodo(Constante.TPublico, Constante.TConstructor, 0, clase.Nombre, new List <Simbolo>(), new Ambito(clase.Nombre), clase.Fila, clase.Columna); return(new Simbolo(m.Visibilidad, Constante.TConstructor, m.Nombre, Constante.TConstructor, m.Fila, m.Columna, m.Ambito, m)); } } return(null); }
public void PrimerPasada() { //Limpiamos las variables que utilizamos para la ejecucion Tabla3D.IniciarTabla(); //buscamos el main y apartamos la primera posicion de la tabla de variables foreach (Simbolo sim in Codigo3D.TablaSimbolo) { if (sim.Rol.Equals(Constante.TMain)) { if (Tabla3D.Tabla.Count == 0) { Tabla3D.Tabla.Insert(0, new Variable(sim.Nombre, sim.Rol, sim.Fila, sim.Columna, sim.Ambito, sim.Valor)); } else { TitusTools.InsertarError(Constante.TErrorSemantico, "Exite mas de un metodo main", TitusTools.GetRuta(), 1, 1); } } } foreach (Simbolo sim in Codigo3D.TablaSimbolo) { if (!sim.Rol.Equals(Constante.TMain)) { Tabla3D.Tabla.Add(new Variable(sim.Nombre, sim.Rol, sim.Fila, sim.Columna, sim.Ambito, sim.Valor)); } } if (!TitusTools.HayErrores()) { if (Tabla3D.Tabla.Count > 0) { if (!Tabla3D.Tabla[0].Rol.Equals(Constante.TMain)) { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro un metodo main", TitusTools.GetRuta(), 1, 1); } else { FMetodo main = (FMetodo)Tabla3D.Tabla[0].Valor; main.Ejecutar(); } } } }
public static Object RecorrerArbol(ParseTreeNode Nodo) { switch (Nodo.Term.Name) { case Constante.INICIO: { //LISTA_CLASE; List <Simbolo> clases = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[0]); Ambito ambito = new Ambito(Constante.ARCHIVO, clases); Ejecucion3D ArchivoEjecucion = new Ejecucion3D(ambito); return(ArchivoEjecucion); } case Constante.LISTA_SENTENCIAS: { List <Simbolo> tabla = new List <Simbolo>(); if (Nodo.ChildNodes.Count > 0) { tabla = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[0]); } return(tabla); } case Constante.LISTA_SENTENCIA: { List <Simbolo> tabla = new List <Simbolo>(); foreach (ParseTreeNode nodo in Nodo.ChildNodes) { foreach (Simbolo sim in (List <Simbolo>)RecorrerArbol(nodo)) { tabla.Add(sim); } } return(tabla); } case Constante.SENTENCIA: { List <Simbolo> lista = new List <Simbolo>(); if (Nodo.ChildNodes.Count == 2) { List <Simbolo> cuerpo = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[1]); FMetodo metodo = new FMetodo(Constante.TPublico, Constante.TMain, Constante.TMain, new List <Simbolo>(), new Ambito(Constante.TMain, cuerpo), Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1); Simbolo s = new Simbolo(metodo.Visibilidad, metodo.Tipo, metodo.Nombre, Constante.TMain, metodo.Fila, metodo.Columna, metodo.Ambito, metodo); Simbolo anterior = null; foreach (Simbolo sim in metodo.Ambito.TablaSimbolo) { sim.Anterior = anterior; if (anterior != null) { anterior.Siguiente = sim; sim.Anterior = anterior; } anterior = sim; } lista.Add(s); } else { List <Simbolo> cuerpo = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[2]); FMetodo metodo = new FMetodo(Constante.TPublico, Constante.TVoid, Nodo.ChildNodes[1].Token.ValueString, new List <Simbolo>(), new Ambito(Constante.TMain, cuerpo), Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1); Simbolo s = new Simbolo(metodo.Visibilidad, metodo.Tipo, metodo.Nombre, Constante.TMetodo, metodo.Fila, metodo.Columna, metodo.Ambito, metodo); Simbolo anterior = null; foreach (Simbolo sim in metodo.Ambito.TablaSimbolo) { sim.Anterior = anterior; if (anterior != null) { anterior.Siguiente = sim; sim.Anterior = anterior; } anterior = sim; } lista.Add(s); } return(lista); } case Constante.LISTA_INSTRUCCIONES: { List <Simbolo> tabla = new List <Simbolo>(); if (Nodo.ChildNodes.Count > 0) { tabla = (List <Simbolo>)RecorrerArbol(Nodo.ChildNodes[0]); } return(tabla); } case Constante.LISTA_INSTRUCCION: { List <Simbolo> tabla = new List <Simbolo>(); foreach (ParseTreeNode nodo in Nodo.ChildNodes) { Simbolo sim = (Simbolo)RecorrerArbol(nodo); tabla.Add(sim); } return(tabla); } case Constante.INSTRUCCION: { if (Nodo.ChildNodes.Count == 1) { switch (Nodo.ChildNodes[0].Term.Name) { case Constante.Etiqueta: return(new Simbolo(Constante.TPublico, Constante.Etiqueta, Nodo.ChildNodes[0].Token.ValueString, Constante.Etiqueta, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.Etiqueta), null)); case Constante.Id: return(new Simbolo(Constante.TPublico, Constante.LLAMADA_METODO, Nodo.ChildNodes[0].Token.ValueString, Constante.LLAMADA_METODO, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.LLAMADA_METODO), null)); default: return(RecorrerArbol(Nodo.ChildNodes[0])); } } else if (Nodo.ChildNodes.Count == 2) { if (Nodo.ChildNodes[0].Token.ValueString.Equals(Constante.TGoto)) { return(new Simbolo(Constante.TPublico, Constante.TGoto, Nodo.ChildNodes[1].Token.ValueString, Constante.TGoto, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TGoto), null)); } else { return(new Simbolo(Constante.TPublico, Constante.TError, Nodo.ChildNodes[1].Token.ValueString, Constante.TError, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TError), null)); } } else if (Nodo.ChildNodes.Count == 3) { String tipo = (String)RecorrerArbol(Nodo.ChildNodes[1]); String temp = Nodo.ChildNodes[2].Token.ValueString; FPrint print = new FPrint(tipo, temp); Simbolo sim = new Simbolo(Constante.TPublico, Constante.TPrint, Constante.TPrint, Constante.TPrint, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TPrint), print); print.Padre = sim; return(sim); } else { String Tipo = Constante.TIf; if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.TIfFalse)) { Tipo = Constante.TIfFalse; } FNodoExpresion cond = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); String etq = Nodo.ChildNodes[3].Token.ValueString; FIf si = new FIf(Tipo, cond, etq); Simbolo sim = new Simbolo(Constante.TPublico, Constante.TIf, Constante.TIf, Constante.TIf, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.TIf), si); si.Padre = sim; return(sim); } } case Constante.ASIGNACION: if (Nodo.ChildNodes.Count == 2) { if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.Temporal)) { FNodoExpresion val = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); FAsignacion3D asi = new FAsignacion3D(Constante.Temporal, null, val, Nodo.ChildNodes[0].Token.ValueString); Simbolo sim = new Simbolo(Constante.TPublico, Constante.ASIGNACION, Constante.ASIGNACION, Constante.ASIGNACION, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.ASIGNACION), asi); return(sim); } else { FNodoExpresion val = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); FAsignacion3D asi = new FAsignacion3D(Nodo.ChildNodes[0].Term.Name, null, val, ""); Simbolo sim = new Simbolo(Constante.TPublico, Constante.ASIGNACION, Constante.ASIGNACION, Constante.ASIGNACION, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.ASIGNACION), asi); return(sim); } } else { FNodoExpresion acceos = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); FNodoExpresion val = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[2]); FAsignacion3D asi = new FAsignacion3D(Nodo.ChildNodes[0].Token.ValueString, acceos, val, ""); Simbolo sim = new Simbolo(Constante.TPublico, Constante.ASIGNACION, Constante.ASIGNACION, Constante.ASIGNACION, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, new Ambito(Constante.ASIGNACION), asi); return(sim); } case Constante.TPrint: return(Nodo.ChildNodes[0].Term.Name); case Constante.RELACIONAL: { FNodoExpresion izq = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[0]); FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[2]); return(new FNodoExpresion(izq, der, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.Location.Line + 1, Nodo.ChildNodes[1].Token.Location.Column + 1, null)); } case Constante.ARITMETICA: if (Nodo.ChildNodes.Count == 3) { FNodoExpresion izq = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[0]); FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[2]); return(new FNodoExpresion(izq, der, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.ValueString, Nodo.ChildNodes[1].Token.Location.Line + 1, Nodo.ChildNodes[1].Token.Location.Column + 1, null)); } else { if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.TMenos)) { FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); return(new FNodoExpresion(null, der, Nodo.ChildNodes[0].Token.ValueString, Nodo.ChildNodes[0].Token.ValueString, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, null)); } else if (Nodo.ChildNodes[0].Term.Name.Equals(Constante.THeap)) { FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); return(new FNodoExpresion(null, der, Constante.THeap, Constante.THeap, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, null)); } else { FNodoExpresion der = (FNodoExpresion)RecorrerArbol(Nodo.ChildNodes[1]); return(new FNodoExpresion(null, der, Constante.TStack, Constante.TStack, Nodo.ChildNodes[0].Token.Location.Line + 1, Nodo.ChildNodes[0].Token.Location.Column + 1, null)); } } case Constante.EXP: { return(RecorrerArbol(Nodo.ChildNodes[0])); } case Constante.Entero: return(new FNodoExpresion(null, null, Constante.TEntero, Constante.TEntero, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString)); case Constante.Decimal: return(new FNodoExpresion(null, null, Constante.TDecimal, Constante.TDecimal, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString)); case Constante.TH: return(new FNodoExpresion(null, null, Constante.TH, Constante.TH, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString)); case Constante.TP: return(new FNodoExpresion(null, null, Constante.TP, Constante.TP, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString)); case Constante.Temporal: return(new FNodoExpresion(null, null, Constante.Temporal, Nodo.Token.ValueString, Nodo.Token.Location.Line + 1, Nodo.Token.Location.Column + 1, Nodo.Token.ValueString)); } return(null); }