public static void getReporteTS(TablaSimbolos ts, ref DataGridView tabla) { /*public String nombre, padre, clase; * public int ambito, tipo, rol, pos, tam; * //public int fila, columna; * public List<int> dimensiones;*/ tabla.Columns.Add(crearColumna("#")); tabla.Columns.Add(crearColumna("Rol")); tabla.Columns.Add(crearColumna("Nombre")); tabla.Columns.Add(crearColumna("Padre")); tabla.Columns.Add(crearColumna("Tipo")); tabla.Columns.Add(crearColumna("Clase")); tabla.Columns.Add(crearColumna("Ambito")); tabla.Columns.Add(crearColumna("Visibilidad")); tabla.Columns.Add(crearColumna("Posicion")); tabla.Columns.Add(crearColumna("Tamaño")); tabla.Columns.Add(crearColumna("Dimensiones")); int id = 1; foreach (Simbolo simbolo in ts) { object[] fila = new object[11]; fila[0] = id; fila[1] = Simbolo.getValor(simbolo.rol); fila[2] = simbolo.nombre; fila[3] = simbolo.padre; fila[4] = Simbolo.getValor(simbolo.tipo); fila[5] = simbolo.clase; if (simbolo.clase == null) { fila[5] = "--------"; } fila[6] = Simbolo.getValor(simbolo.ambito); fila[7] = Simbolo.getVisibilidad(simbolo.visibilidad); fila[8] = simbolo.pos; fila[9] = simbolo.tam; fila[10] = "--------"; if (simbolo.dimensiones != null) { fila[10] = ""; foreach (int v in simbolo.dimensiones) { fila[10] += v + " "; } } tabla.Rows.Add(fila); id++; } }
public static Nodo generarDividirC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } if (nder.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = (int)Simbolo.Tipo.DECIMAL; if (nizq.tipo == (int)Simbolo.Tipo.NUMERO || nizq.tipo == (int)Simbolo.Tipo.CARACTER || nizq.tipo == (int)Simbolo.Tipo.BOOLEAN || nizq.tipo == (int)Simbolo.Tipo.DECIMAL) { if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String eError = GeneradorC3D.getEtiqueta(); String eSalida = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Dividir num / num")); // Verificar si num en nder no es 0 GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, nder.cadena, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, nizq.cadena, "/", nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); GeneradorC3D.generarEtiquetas((eError)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Error: No se puede dividir entre 0")); GeneradorC3D.generarEtiquetas((eSalida)); return(nodo); } } //Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede dividir " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
public Simbolo guardarSuper(String padre) { Simbolo seste = new Simbolo(); seste.ambito = (int)Simbolo.Tipo.LOCAL; seste.clase = ""; seste.nombre = "super"; seste.padre = padre; seste.pos = 1; seste.rol = (int)Simbolo.Tipo.VARIABLE; seste.tam = 1; seste.tipo = -1; seste.dimensiones = null; return(seste); }
public static String getNombreProcedimiento(Procedimiento proc) { String nombre = proc.nombre; if (proc.parametros != null) { if (proc.parametros.Count > 0) { foreach (Atributo p in proc.parametros) { nombre += "_" + Simbolo.getValor(p.tipo); } } } return(nombre); }
public Simbolo guardarSimboloConstructor(String padre, Procedimiento constructor) { Simbolo sconstructor = new Simbolo(); sconstructor.ambito = (int)Simbolo.Tipo.GLOBAL; sconstructor.visibilidad = constructor.visibilidad; sconstructor.clase = ""; sconstructor.dimensiones = null; sconstructor.nombre = constructor.completo; sconstructor.padre = padre; sconstructor.pos = -1; sconstructor.rol = (int)Simbolo.Tipo.CONSTRUCTOR; sconstructor.tam = tamanio; sconstructor.tipo = -1; return(sconstructor); }
private static String getExpresiones(ParseTreeNode expresiones, ref List <Nodo> exps) { String cadena = ""; foreach (ParseTreeNode nexp in expresiones.ChildNodes) { Nodo exp = Expresion.expresionC3D(nexp); if (exp == null) { return(null); } exps.Add(exp); cadena += "_" + Simbolo.getValor(exp.tipo); } return(cadena); }
public static Nodo generarC3DAcceso(ParseTreeNode acceso, Tipo tipo, Nodo nExp) { actual = null; Nodo nodo = null; String puntero = "P"; String estructura = "Stack"; foreach (ParseTreeNode objeto in acceso.ChildNodes) { if (objeto.Term.Name.Equals("id")) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Accediendo a un id " + objeto.Token.Text)); nodo = generarC3DID(objeto.Token.Text, tipo, puntero, estructura); } else if (objeto.Term.Name.Equals("NARREGLO")) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Accediendo a un arreglo")); nodo = Arreglo.generarAsignacionC3D(objeto.ChildNodes[0].Token.Text, objeto.ChildNodes[1], tipo); } else { // llamada con retorno GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Accediendo a una llamada")); nodo = Llamada.llamadaC3D(objeto, tipo); } tipo = Tipo.ESTE; if (nodo != null) { estructura = nodo.estructura; puntero = nodo.cadena; } } if (nExp != null) { // Asignar el valor a la variable! GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Asignar el valor a la variable del acceso")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, nExp.cadena)); } return(nodo); }
private void btnAgregarProcedimiento_Click(object sender, EventArgs e) { // Guardar datos de procedimiento int vis = Simbolo.getVisibilidad(visibilidad.SelectedItem.ToString().ToLower()); String stipo = tipo.SelectedItem.ToString().ToLower(); int tipo_valor = Simbolo.getTipo(stipo); String nombre = txtNombre.Text; // Guardar el procedimiento en la lista de procedimientos listProcedimientos.Items.Add(getValor(nombre, vis) + "() : " + stipo); // Guardar el procedimiento en la clase clase.agregarProcedimiento(new Procedimiento(nombre, tipo_valor, vis, null, null, false, listProcedimientos.Items.Count, 0)); // Limpiar visibilidad.ResetText(); tipo.ResetText(); txtNombre.Text = ""; }
public String getValor() { String val = ""; switch (visibilidad) { case (int)Simbolo.Visibilidad.PUBLICO: val = "+ " + nombre; break; case (int)Simbolo.Visibilidad.PRIVADO: val = "- " + nombre; break; default: val = "# " + nombre; break; } return(val + " : " + Simbolo.getValor(tipo)); }
public Simbolo guardarSimboloParametro(String padre, Atributo parametro) { Simbolo sparametro = new Simbolo(); sparametro.ambito = (int)Simbolo.Tipo.LOCAL; sparametro.clase = ""; if (parametro.tipo == (int)Simbolo.Tipo.CLASE) { sparametro.clase = parametro.clase; } sparametro.dimensiones = parametro.dimensiones; sparametro.nombre = parametro.nombre; sparametro.padre = padre; sparametro.pos = tamanio; tamanio++; sparametro.rol = (int)Simbolo.Tipo.PARAMETRO; sparametro.tam = 1; sparametro.tipo = parametro.tipo; return(sparametro); }
private static void generarC3DThis(Clase clase, String puntero, String estructura) { Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre); if (sclase != null) { String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del this")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador donde incia el this")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para globales de " + clase.nombre)); aumentarHeap(Convert.ToString(sclase.tam)); // Recorrer las variables globales y asignarles foreach (Atributo atr in clase.atributos) { if (atr.esArreglo) { Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.ESTE); } else { if (atr.valor != null) { instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre)); Nodo exp = Expresion.expresionC3D(atr.valor); Acceso.actual = null; instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre)); Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.ESTE, "P", "Stack"); if (nodo != null) { // Asignar la expresion instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Asignar expresion al atributo " + atr.nombre)); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, exp.cadena)); } } } } } }
public String generarCodigoAtributos(Clase clase) { String cadena = ""; foreach (Atributo a in clase.atributos) { if (tipoArchivo.SelectedIndex == 0) { // OLC++ cadena += "\t" + getVisibilidad(a.visibilidad) + " " + Simbolo.getValor(a.tipo) + " " + a.nombre + ";\n"; } else if (tipoArchivo.SelectedIndex == 1) { // Tree cadena += "\t" + getVisibilidad(a.visibilidad) + " " + Simbolo.getValor(a.tipo) + " " + a.nombre + "\n"; } } return(cadena); }
public static String generarParametrizacionC3D(ParseTreeNode indices, Simbolo sid) { int con = 1; String temp = null; foreach (ParseTreeNode hijo in indices.ChildNodes) { Nodo exp = Expresion.expresionC3D(hijo); if (exp == null) { break; } int tam = sid.getTamanio(con); String t1 = GeneradorC3D.getTemporal(); String t2 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Restar uno a la posicion en la dimension " + con)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, exp.cadena, "-", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicarla por el tamanio de la dimension")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, t1, "*", Convert.ToString(tam))); if (con > 1) { String t3 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar las dos posiciones")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, temp, "+", t2)); temp = t3; } else { temp = t2; } con++; } return(temp); }
public Simbolo guardarSimboloProcedimiento(String padre, Procedimiento procedimiento) { Simbolo sprocedimiento = new Simbolo(); sprocedimiento.ambito = (int)Simbolo.Tipo.GLOBAL; sprocedimiento.clase = ""; sprocedimiento.dimensiones = null; sprocedimiento.nombre = procedimiento.completo; sprocedimiento.visibilidad = procedimiento.visibilidad; sprocedimiento.padre = padre; sprocedimiento.tam = tamanio; sprocedimiento.tipo = procedimiento.tipo; sprocedimiento.rol = (int)Simbolo.Tipo.FUNCION; if (procedimiento.tipo == (int)Simbolo.Tipo.VACIO) { sprocedimiento.rol = (int)Simbolo.Tipo.METODO; } if (procedimiento.tipo == (int)Simbolo.Tipo.CLASE) { sprocedimiento.clase = procedimiento.clase; } return(sprocedimiento); }
private static void generarC3DMain(Clase clase) { C3DSentencias.claseActual = clase; Simbolo smain = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, "main"); // Guardar this de la clase main instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para this y super de " + clase.nombre)); String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar inicio -> pos 0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "0", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "1", "1")); GeneradorC3D.aumentarHeap("2"); // Generar this y super generarC3DThis(clase, t1, "Heap"); // Guardar super de la clase main generarC3DSuper(clase, t1, "Heap"); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamada al main")); instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, clase.nombre + "_main")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Terminar la ejecucion")); instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "")); }
public List <Atributo> guardarParametros(ParseTreeNode nodo) { List <Atributo> parametros = new List <Atributo>(); foreach (ParseTreeNode pa in nodo.ChildNodes) { // PARAMETRO -> TIPO NARREGLO -> id INDICES int tipo = Simbolo.getTipo(pa.ChildNodes[0].Token.Text); Atributo parametro = new Atributo(pa.ChildNodes[1].Token.Text, tipo, pa.ChildNodes[1].Token.Location.Line, pa.ChildNodes[1].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { parametro.asignarClase(pa.ChildNodes[0].ChildNodes[0].Token.Text); } if (pa.ChildNodes[2].ChildNodes.Count > 0) { parametro.asignarArreglo(pa.ChildNodes[2]); } parametros.Add(parametro); } return(parametros); }
public static Nodo generarSumaC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } if (nder.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } switch (nizq.tipo) { case (int)Simbolo.Tipo.NUMERO: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, num + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = nder.tipo; } return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , num + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para nueva cadena")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.DECIMAL: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, decimal + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , decimal + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.CARACTER: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, caracter + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nder.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , caracter + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.BOOLEAN: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); if (nder.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + num")); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + decimal")); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nder.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { return(Logica.generarC3D(izq, "||", der)); } break; case (int)Simbolo.Tipo.CADENA: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + num")); } else if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + decimal")); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + caracter")); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nizq.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; } // Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede sumar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
public String generarCodigoProcedimientos(Clase clase) { String cadena = ""; foreach (Procedimiento a in clase.procedimientos) { if (tipoArchivo.SelectedIndex == 0) { // OLC++ cadena += "\t" + getVisibilidad(a.visibilidad) + " " + Simbolo.getValor(a.tipo) + " " + a.nombre + "(){\n\n\t}\n\n"; } else if (tipoArchivo.SelectedIndex == 1) { // Tree if (a.tipo == (int)Simbolo.Tipo.VACIO) { cadena += "\t" + getVisibilidad(a.visibilidad) + " metodo " + a.nombre + "():\n\n"; } else { cadena += "\t" + getVisibilidad(a.visibilidad) + " funcion " + Simbolo.getValor(a.tipo) + " " + a.nombre + "():\n\n"; } } } return(cadena); }
public Procedimiento guardarProcedimiento(ParseTreeNode nodo) { /* * METODO -> sobreescribir VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE | VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE | sobreescribir TPROC id LISTA_PARAMETROS BLOQUE | TPROC id LISTA_PARAMETROS BLOQUE */ List <Atributo> parametros; if (nodo.ChildNodes.Count == 6) { // METODO -> sobreescribir VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE parametros = guardarParametros(nodo.ChildNodes[4]); String id = nodo.ChildNodes[3].Token.Text; int vis = Simbolo.getVisibilidad(nodo.ChildNodes[1].ChildNodes[0].Token.Text); if (nodo.ChildNodes[2].ChildNodes.Count == 3) { int tipo = Simbolo.getTipo(nodo.ChildNodes[2].ChildNodes[1].Token.Text); Procedimiento proc = new Procedimiento(id, tipo, vis, parametros, nodo.ChildNodes[5].ChildNodes[0], true, nodo.ChildNodes[3].Token.Location.Line, nodo.ChildNodes[3].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { proc.agregarClase(nodo.ChildNodes[2].ChildNodes[1].Token.Text); } if (nodo.ChildNodes[2].ChildNodes[2].ChildNodes.Count > 0) { proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]); } return(proc); } else { return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, vis, parametros, nodo.ChildNodes[5].ChildNodes[0], true, nodo.ChildNodes[3].Token.Location.Line, nodo.ChildNodes[3].Token.Location.Column)); } } else if (nodo.ChildNodes.Count == 5) { /* * METODO -> VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE | sobreescribir TPROC id LISTA_PARAMETROS BLOQUE */ parametros = guardarParametros(nodo.ChildNodes[3]); String id = nodo.ChildNodes[2].Token.Text; if (nodo.ChildNodes[0].Term.Name.Equals("VISIBILIDAD")) { int vis = Simbolo.getVisibilidad(nodo.ChildNodes[0].ChildNodes[0].Token.Text); if (nodo.ChildNodes[2].ChildNodes.Count == 3) { int tipo = Simbolo.getTipo(nodo.ChildNodes[2].ChildNodes[1].Token.Text); Procedimiento proc = new Procedimiento(id, tipo, vis, parametros, nodo.ChildNodes[4].ChildNodes[0], false, nodo.ChildNodes[2].Token.Location.Line, nodo.ChildNodes[2].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { proc.agregarClase(nodo.ChildNodes[2].ChildNodes[1].Token.Text); } if (nodo.ChildNodes[2].ChildNodes[2].ChildNodes.Count > 0) { proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]); } return(proc); } else { return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, vis, parametros, nodo.ChildNodes[4].ChildNodes[0], false, nodo.ChildNodes[2].Token.Location.Line, nodo.ChildNodes[2].Token.Location.Column)); } } else { if (nodo.ChildNodes[2].ChildNodes.Count == 3) { int tipo = Simbolo.getTipo(nodo.ChildNodes[2].ChildNodes[1].Token.Text); Procedimiento proc = new Procedimiento(id, tipo, parametros, nodo.ChildNodes[4].ChildNodes[0], true, nodo.ChildNodes[2].Token.Location.Line, nodo.ChildNodes[2].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { proc.agregarClase(nodo.ChildNodes[2].ChildNodes[1].Token.Text); } if (nodo.ChildNodes[2].ChildNodes[2].ChildNodes.Count > 0) { proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]); } return(proc); } else { return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, parametros, nodo.ChildNodes[4].ChildNodes[0], true, nodo.ChildNodes[2].Token.Location.Line, nodo.ChildNodes[2].Token.Location.Column)); } } } else { // METODO -> TPROC id LISTA_PARAMETROS BLOQUE parametros = guardarParametros(nodo.ChildNodes[2]); String id = nodo.ChildNodes[1].Token.Text; if (nodo.ChildNodes[0].ChildNodes.Count == 3) { int tipo = Simbolo.getTipo(nodo.ChildNodes[0].ChildNodes[1].Token.Text); Procedimiento proc = new Procedimiento(id, tipo, parametros, nodo.ChildNodes[3].ChildNodes[0], false, nodo.ChildNodes[1].Token.Location.Line, nodo.ChildNodes[1].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { proc.agregarClase(nodo.ChildNodes[0].ChildNodes[1].Token.Text); } if (nodo.ChildNodes[0].ChildNodes[2].ChildNodes.Count > 0) { proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]); } return(proc); } else { return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, parametros, nodo.ChildNodes[3].ChildNodes[0], false, nodo.ChildNodes[1].Token.Location.Line, nodo.ChildNodes[1].Token.Location.Column)); } } }
public Clase guardarClase(ParseTreeNode clase) { // CLASE -> id BCUERPO | id id BCUERPO Clase nueva; String nombre_clase = clase.ChildNodes.ElementAt(0).Token.Value.ToString(); int pos = 1; if (clase.ChildNodes.Count == 2) { nueva = new Clase(nombre_clase, clase.ChildNodes[0].Token.Location.Line, clase.ChildNodes[0].Token.Location.Line); } else { // Tiene padre String padre = clase.ChildNodes.ElementAt(1).Token.Value.ToString(); nueva = new Clase(nombre_clase, padre, clase.ChildNodes[0].Token.Location.Line, clase.ChildNodes[0].Token.Location.Line); pos++; } // Recorrer atributos, constructores y procedimientos ParseTreeNode cuerpos = clase.ChildNodes.ElementAt(pos).ChildNodes.ElementAt(0); foreach (ParseTreeNode cuerpo in cuerpos.ChildNodes) { if (cuerpo.ChildNodes.ElementAt(0).Term.Name.Equals("METODO")) { Procedimiento proc = guardarProcedimiento(cuerpo.ChildNodes[0]); proc.llenarDeclaraciones(proc.sentencias, nueva.atributos); nueva.agregarProcedimiento(proc); } else if (cuerpo.ChildNodes.ElementAt(0).Term.Name.Equals("__constructor")) { Procedimiento cons = guardarConstructor(cuerpo); cons.llenarDeclaraciones(cons.sentencias, nueva.atributos); nueva.agregarConstructor(cons); } else if (cuerpo.ChildNodes.ElementAt(0).Term.Name.Equals("DECLARACION")) { ParseTreeNode declara = cuerpo.ChildNodes[0]; /* DECLARACION -> TIPO + LISTA_IDS + asignarR | TIPO + LISTA_IDS | TIPO + NARREGLO -> id + INDICES */ int tipo = Simbolo.getTipo(declara.ChildNodes[0].Token.Text); ParseTreeNode ids = declara.ChildNodes[1]; if (ids.Term.Name.Equals("NARREGLO")) { Atributo variable = new Atributo(ids.ChildNodes[0].Token.Text, tipo, ids.ChildNodes[0].Token.Location.Line, ids.ChildNodes[0].Token.Location.Column); variable.asignarArreglo(ids.ChildNodes[1]); if (tipo == (int)Simbolo.Tipo.CLASE) { variable.asignarClase(declara.ChildNodes[0].ChildNodes[0].Token.Text); } nueva.agregarAtributo(variable); } else { foreach (ParseTreeNode var in ids.ChildNodes) { Atributo a = new Atributo(var.Token.Text, tipo, var.Token.Location.Line, var.Token.Location.Column); if (declara.ChildNodes.Count == 3) { a.asignarValor(declara.ChildNodes[2]); } nueva.agregarAtributo(a); } } } else if (cuerpo.ChildNodes[0].Term.Name.Equals("VISIBILIDAD")) { int vis = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text); ParseTreeNode declara = cuerpo.ChildNodes[1]; int tipo = Simbolo.getTipo(declara.ChildNodes[0].Token.Text); ParseTreeNode ids = declara.ChildNodes[1]; if (ids.Term.Name.Equals("NARREGLO")) { Atributo variable = new Atributo(ids.ChildNodes[0].Token.Text, tipo, ids.ChildNodes[0].Token.Location.Line, ids.ChildNodes[0].Token.Location.Column); variable.asignarArreglo(ids.ChildNodes[1]); if (tipo == (int)Simbolo.Tipo.CLASE) { variable.asignarClase(declara.ChildNodes[0].ChildNodes[0].Token.Text); } nueva.agregarAtributo(variable); } else { foreach (ParseTreeNode var in ids.ChildNodes) { Atributo a = new Atributo(var.Token.Text, tipo, var.Token.Location.Line, var.Token.Location.Column); if (declara.ChildNodes.Count == 3) { a.asignarValor(declara.ChildNodes[2]); } nueva.agregarAtributo(a); } } } } return(nueva); }
public Clase guardarClase(ParseTreeNode nodo) { // CLASE -> id id CUERPOS //| id CUERPOS Clase nueva; int idCuerpos = 1; if (nodo.ChildNodes.Count == 3) { // Tiene padre nueva = new Clase(nodo.ChildNodes[0].Token.Text, nodo.ChildNodes[1].Token.Text, nodo.ChildNodes[0].Token.Location.Line, nodo.ChildNodes[0].Token.Location.Column); idCuerpos = 2; } else { // No tiene padre nueva = new Clase(nodo.ChildNodes[0].Token.Text, nodo.ChildNodes[0].Token.Location.Line, nodo.ChildNodes[0].Token.Location.Column); } // Recorrer cuerpos foreach (ParseTreeNode cuerpo in nodo.ChildNodes[idCuerpos].ChildNodes) { // Recorrer cada uno de los cuerpos en busca de Declaraciones, Metodos, Funciones o Constructores /* * CUERPO.Rule = VISIBILIDAD + TPROC + id + TCUERPO? -> 4 , 3 | TPROC + id + TCUERPO? -> 3 , 2 | sobreescribir + METODO -> 2 | PRINCIPAL -> 1 | VISIBILIDAD + CONSTRUCTOR -> 2 | CONSTRUCTOR -> 1 | ASIGNACION + fin; -> 1 */ switch (cuerpo.ChildNodes.Count) { case 1: // CONSTRUCTOR o PRINCIPAL if (cuerpo.ChildNodes[0].Term.Name.Equals("CONSTRUCTOR")) { Procedimiento cons = guardarConstructor(cuerpo.ChildNodes[0], (int)Simbolo.Visibilidad.PUBLICO); cons.llenarDeclaraciones(cons.sentencias, nueva.atributos); nueva.agregarConstructor(cons); } else if (cuerpo.ChildNodes[0].Term.Name.Equals("PRINCIPAL")) { Procedimiento proc = new Procedimiento("main", (int)Simbolo.Tipo.VACIO, new List <Atributo>(), cuerpo.ChildNodes[0].ChildNodes[0], cuerpo.Span.Location.Line, cuerpo.Span.Location.Column); proc.llenarDeclaraciones(proc.sentencias, nueva.atributos); nueva.agregarProcedimiento(proc); } break; case 2: // sobreescribir METODO // VISIBILIDAD CONSTRUCTOR // TPROC id if (cuerpo.ChildNodes[1].Term.Name.Equals("CONSTRUCTOR")) { int vis = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text); Procedimiento cons = guardarConstructor(cuerpo.ChildNodes[1], vis); cons.llenarDeclaraciones(cons.sentencias, nueva.atributos); nueva.agregarConstructor(cons); } else if (cuerpo.ChildNodes[1].Term.Name.Equals("METODO")) { Procedimiento proc = guardarProcedimiento (cuerpo.ChildNodes[1], true); proc.llenarDeclaraciones(proc.sentencias, nueva.atributos); nueva.agregarProcedimiento(proc); } else { // TPROC id ParseTreeNode tproc = cuerpo.ChildNodes[0]; int tipo = Simbolo.getTipo(tproc.ChildNodes[0].Token.Text); Atributo a = new Atributo(cuerpo.ChildNodes[1].Token.Text, tipo, cuerpo.ChildNodes[1].Token.Location.Line, cuerpo.ChildNodes[1].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { a.asignarClase(tproc.ChildNodes[0].Token.Text); } nueva.agregarAtributo(a); } break; case 3: // TPROC id CMETODO // TPROC id DARREGLO // TPROC id EXP // VISIBILIDAD TPROC id if (cuerpo.ChildNodes[0].Term.Name.Equals("TPROC")) { if (cuerpo.ChildNodes[2].Term.Name.Equals("CMETODO")) { // Es procedimiento Procedimiento proc = guardarProcedimiento (cuerpo, true); proc.llenarDeclaraciones(proc.sentencias, nueva.atributos); nueva.agregarProcedimiento(proc); } else { // Es atributo ParseTreeNode tproc = cuerpo.ChildNodes[0]; String ctipo = tproc.ChildNodes[0].Token.Text; int tipo = Simbolo.getTipo(ctipo); Atributo a = new Atributo(cuerpo.ChildNodes[1].Token.Text, tipo, cuerpo.ChildNodes[1].Token.Location.Line, cuerpo.ChildNodes[1].Token.Location.Column); // Ver si el tipo de la variable es una clase if (tipo == (int)Simbolo.Tipo.CLASE) { a.asignarClase(ctipo); } // Verificar si es un arreglo o tiene valor if (cuerpo.ChildNodes[2].Term.Name.Equals("EXP")) { // Tiene valor a.asignarValor(cuerpo.ChildNodes[2]); } else { // Es arreglo ParseTreeNode darr = cuerpo.ChildNodes[2]; a.asignarArreglo(darr.ChildNodes[0]); if (darr.ChildNodes.Count == 2) { a.asignarValor(darr.ChildNodes[1]); } } nueva.agregarAtributo(a); } } else if (cuerpo.ChildNodes[0].Term.Name.Equals("VISIBILIDAD")) { // Es atributo int vis = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text); ParseTreeNode tproc = cuerpo.ChildNodes[1]; String ctipo = tproc.ChildNodes[0].Token.Text; int tipo = Simbolo.getTipo(ctipo); Atributo a = new Atributo(cuerpo.ChildNodes[2].Token.Text, tipo, vis, cuerpo.ChildNodes[2].Token.Location.Line, cuerpo.ChildNodes[2].Token.Location.Column); if (tipo == (int)Simbolo.Tipo.CLASE) { a.asignarClase(ctipo); } nueva.agregarAtributo(a); } break; case 4: // VISIBILIDAD TPROC id CMETODO // VISIBILIDAD TPROC id DARREGLO // VISIBILIDAD TPROC id EXP int vis2 = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text); if (cuerpo.ChildNodes[3].Term.Name.Equals("CMETODO")) { // Es procedimiento Procedimiento proc = guardarProcedimiento(cuerpo, false); proc.llenarDeclaraciones(proc.sentencias, nueva.atributos); nueva.agregarProcedimiento(proc); } else { // Es atributo --> DARREGLO o EXP // Es atributo ParseTreeNode tproc = cuerpo.ChildNodes[1]; String ctipo = tproc.ChildNodes[0].Token.Text; int tipo = Simbolo.getTipo(ctipo); Atributo a = new Atributo(cuerpo.ChildNodes[2].Token.Text, tipo, vis2, cuerpo.ChildNodes[2].Token.Location.Line, cuerpo.ChildNodes[2].Token.Location.Column); // Ver si el tipo de la variable es una clase if (tipo == (int)Simbolo.Tipo.CLASE) { a.asignarClase(ctipo); } // Verificar si es un arreglo o tiene valor if (cuerpo.ChildNodes[3].Term.Name.Equals("EXP")) { // Tiene valor a.asignarValor(cuerpo.ChildNodes[3]); } else { // Es arreglo ParseTreeNode darr = cuerpo.ChildNodes[3]; a.asignarArreglo(darr.ChildNodes[0]); if (darr.ChildNodes.Count == 2) { a.asignarValor(darr.ChildNodes[1]); } } nueva.agregarAtributo(a); } break; } } return(nueva); }
public static Nodo generarCrecimientoC3D(ParseTreeNode crecer) { // Es incremento o decremento y tiene que ser de tipo entero // CRECER -> EXP (++ | --) Nodo nodo = Expresion.expresionC3D(crecer.ChildNodes[0]); if (nodo == null) { return(null); } ParseTreeNode varC = crecer.ChildNodes[1]; String ope; if (varC.Term.Name.Equals("++")) { ope = "+"; } else { ope = "-"; } if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL || nodo.tipo == (int)Simbolo.Tipo.CARACTER) { String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// expresion " + ope + " expresion")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nodo.cadena, ope, "1")); if (!nodo.referencia.Equals("")) { // Guardar en la variable GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//guardar valor en id")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, temp)); } nodo.cadena = temp; nodo.tipo = (int)Simbolo.Tipo.DECIMAL; } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede incrementar o decrementar el tipo " + Simbolo.getValor(nodo.tipo) + ".", crecer.Token.Location.Line, crecer.Token.Location.Column)); } return(nodo); }
public static Nodo generarRelacional(String ope, String texto, Nodo nizq, Nodo nder, ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); nodo.tipo = (int)Simbolo.Tipo.BOOLEAN; nodo.etqVerdadera = GeneradorC3D.getEtiqueta(); nodo.etqFalsa = GeneradorC3D.getEtiqueta(); if (nizq.tipo == (int)Simbolo.Tipo.NUMERO || nizq.tipo == (int)Simbolo.Tipo.DECIMAL) { if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa)); return(nodo); } } else if (nizq.tipo == (int)Simbolo.Tipo.CARACTER) { if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nder = sumarCaracteres(nder.cadena); } if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.CADENA) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa)); return(nodo); } } else if (nizq.tipo == (int)Simbolo.Tipo.CADENA) { nizq = sumarCaracteres(nizq.cadena); if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nder = sumarCaracteres(nder.cadena); } if (nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.CADENA) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa)); return(nodo); } } Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede comparar si son " + texto + " el tipo " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
public static Nodo instanciaC3D(ParseTreeNode nuevo, Acceso.Tipo tipo) { // NUEVO -> new id EXPS // SUPER -> super [ EXPS ] Nodo nodo = new Nodo(); // NUEVO String idC = nuevo.ChildNodes[1].Token.Text; // Buscar que la clase exista Clase instancia = GeneradorC3D.getClasePadre(idC); if (instancia != null) { List <Nodo> expresiones = new List <Nodo>(); String llave = getExpresiones(nuevo.ChildNodes[2], ref expresiones); if (llave != null) { llave = "constructor" + llave; Simbolo procedimiento = TablaSimbolos.getInstance.getProcedimiento( instancia.nombre, llave); if (procedimiento == null || procedimiento.visibilidad == (int)Simbolo.Visibilidad.PRIVADO) { // Error Semantico! No se puede hacer instancia por ser privado return(null); } // Get parametros List <Simbolo> sparametros = TablaSimbolos.getInstance.getParametros( instancia.nombre, procedimiento); if (expresiones.Count == sparametros.Count) { int tam = GeneradorC3D.tamMain; if (C3DSentencias.procedimientoActual != null) { // Esta en el main! tam = C3DSentencias.procedimientoActual.tam; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Pasar los parametros")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Crear un temporal auxiliar para el incremento del ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", Convert.ToString(tam))); parametrosC3D(taux, sparametros, expresiones); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar el ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", Convert.ToString(tam))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamar al procedimiento " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, instancia.nombre + "_" + llave)); // Ver si hay retorno Y guardarlo String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del retorno en el ambito actual ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P", "+", "2")); nodo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del retorno de la funcion " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", nodo.cadena, temp)); nodo.tipo = (int)Simbolo.Tipo.CLASE; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir el ambito ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", Convert.ToString(tam))); } } } return(nodo); }
internal static Nodo unarioC3D(ParseTreeNode n2) { Nodo nodo = Expresion.expresionC3D(n2); if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar -1 * " + Simbolo.getValor(nodo.tipo))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "-1", "*", nodo.cadena)); nodo.cadena = temp; } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede cambiar signo a " + Simbolo.getValor(nodo.tipo) + ".", n2.Span.Location.Line, n2.Span.Location.Column)); } return(nodo); }
private static void generarC3DSuper(Clase clase, String puntero, String estructura) { Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre); if (sclase != null) { String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del super")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar posicion donde empieza super")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H")); // Buscar clase padre Clase padre; if (clase.padre != null) { padre = getClasePadre(clase.padre); if (padre == null) { return; } } else { return; } sclase = TablaSimbolos.getInstance.getClase(clase.padre); if (sclase == null) { return; } instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para la clase padre" + sclase.nombre)); aumentarHeap(Convert.ToString(sclase.tam)); // Recorrer las variables globales y asignarles foreach (Atributo atr in padre.atributos) { if (atr.visibilidad == (int)Simbolo.Visibilidad.PUBLICO || atr.visibilidad == (int)Simbolo.Visibilidad.PROTEGIDO) { if (atr.esArreglo) { Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.SUPER); } else { if (atr.valor != null) { instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre)); Nodo exp = Expresion.expresionC3D(atr.valor); Acceso.actual = null; instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre)); Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.SUPER, "P", "Stack"); if (nodo != null) { // Asignar la expresion instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar valor del atributo " + atr.nombre)); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, exp.cadena)); } } } } } } }
public static Nodo generarMultiplicarC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } if (nder.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = (int)Simbolo.Tipo.NUMERO; switch (nizq.tipo) { case (int)Simbolo.Tipo.NUMERO: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, num * num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = nder.tipo; } return(nodo); } break; case (int)Simbolo.Tipo.DECIMAL: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, decimal * num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; return(nodo); } break; case (int)Simbolo.Tipo.BOOLEAN: // bool - num if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, bool * num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = nder.tipo; } return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { return(Logica.generarC3D(izq, "&&", der)); } break; case (int)Simbolo.Tipo.CARACTER: // bool - num if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Restar dos temporales, caracter * num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = nder.tipo; } return(nodo); } break; } //Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede multiplicar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
public static Nodo generarC3DID(String id, Tipo tipo, String puntero, String estructura) { // id Simbolo sid; Nodo nodo = new Nodo(); nodo.estructura = estructura; if (C3DSentencias.procedimientoActual == null || actual != null) { if (actual != null) { if (actual.tipo != (int)Simbolo.Tipo.CLASE) { // Error! No es una clase, no se puede acceder! return(null); } estructura = "Heap"; sid = TablaSimbolos.getInstance.buscarVariable(id, actual.clase, null, tipo); } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, null, tipo); } } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, C3DSentencias.procedimientoActual.nombre, tipo); } if (sid != null) { String pos = "1"; if (sid.ambito == (int)Simbolo.Tipo.GLOBAL) { // Global if ((actual == null && C3DSentencias.claseActual.nombre.Equals(sid.padre)) || (actual != null && sid.padre.Equals(actual.clase))) { pos = "0"; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El " + id + "es global!")); String t1 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion de este o super")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", pos)); String t2 = t1; if (estructura.Equals("Stack")) { t2 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del ambito self o super en el Heap")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, estructura, t2, t1)); } estructura = "Heap"; String t9 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del ambito self o super")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, estructura, t9, t2)); puntero = t9; } // Generar C3D para buscar la posicion de ID y luego el valor String t3 = GeneradorC3D.getTemporal(); String t4 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del " + id)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, puntero, "+", Convert.ToString(sid.pos))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del " + id)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, estructura, t4, t3)); actual = sid; nodo.tipo = sid.tipo; nodo.referencia = t3; nodo.cadena = t4; nodo.estructura = estructura; return(nodo); } else { // Error: La variable id no existe! return(null); } }
/* //ARREGLOS! * public Nodo guardarArregloC3D(Simbolo arr, ParseTreeNode indices, String eError) * { * // INDICES -> INDICES INDICE * // | INDICE * Nodo nuevo = new Nodo(); * if (indices.ChildNodes.Count == 2) * { * Nodo indiceE = guardarArregloC3D(arr, indices.ChildNodes.ElementAt(0), eError); * Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(1), eError, indiceE.externa); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// " + indiceE.externa.ToString() + " dimension externa!")); * String tam = tablaSimbolos.getTamanio(arr, indiceE.externa, dimInterna.interna).ToString(); * String temp1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, dimInterna.cadena, "*", tam)); * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indiceE.cadena, "+", temp1)); * nuevo.externa = indiceE.externa + 1; * } * else * { * Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(0), eError, 1); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// 1 dimension externa!")); * nuevo.cadena = getTemporal(); * String tam = tablaSimbolos.getTamanio(arr, 1, dimInterna.interna).ToString(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, dimInterna.cadena, "*", tam)); * nuevo.externa = 2; * } * return nuevo; * } * * public Nodo getInternasC3D(Simbolo arr, ParseTreeNode indice, String eError, int externa) * { * // INDICE -> INDICE EXP * // | EXP * Nodo nuevo = new Nodo(); * if (indice.ChildNodes.Count == 2) * { * Nodo indice1 = getInternasC3D(arr, indice.ChildNodes.ElementAt(0), eError, externa); * Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(1)); * String inf = tablaSimbolos.getIndiceInferior(arr, externa, indice1.interna).ToString(); * String sup = tablaSimbolos.getIndiceSuperior(arr, externa, indice1.interna).ToString(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede")); * String temp1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, exp.cadena, "-", inf)); * String tam = tablaSimbolos.getTamanio(arr, externa, indice1.interna).ToString(); * String temp2 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp2, temp1, "*", tam)); * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indice1.cadena, "+", temp2)); * nuevo.interna = indice1.interna + 1; * } * else * { * //ext -> 1, int -> 1 * Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(0)); * String inf = tablaSimbolos.getIndiceInferior(arr, externa, 1).ToString(); * String sup = tablaSimbolos.getIndiceSuperior(arr, externa, 1).ToString(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede")); * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, exp.cadena, "-", inf)); * nuevo.interna = 2; * } * return nuevo; * } * * //ID! * public Nodo getIDC3D(ParseTreeNode nodo) * { * Nodo nuevo = new Nodo(); * nuevo.pila = "Stack"; * Simbolo objeto = tablaSimbolos.buscarVariable(nodo.ChildNodes.ElementAt(0). * Token.Value.ToString(), nombreMetodo); * if (objeto == null) * { * objeto = tablaSimbolos.buscarGlobal(nodo.ChildNodes.ElementAt(0).Token.Value.ToString()); * if (objeto == null) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() + * " no ha sido declarada!", nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * } * nuevo.tipo = objeto.tipo; * * String eError = getEtiqueta(); * String eSalida = getEtiqueta(); * ParseTreeNode acceso = nodo.ChildNodes.ElementAt(1); * // Generacion de codigo de referencia y valor... * String temp1 = getTemporal(); * nuevo.posicion = temp1; * if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL) * { * nuevo.referencia = "error"; * } * else * { * if (objeto.dimensiones != null) * { * //ES ARREGLO! * } * else * { * if (objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA) * { * nuevo.referencia = temp1; * } * else * { * nuevo.referencia = "error"; * } * } * } * String val = "P"; * if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL) * { * val = "0"; * } * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar posicion en pila o heap (global) de " + objeto.nombre)); * C3D ins1 = new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, val, "+", objeto.pos.ToString()); * instrucciones.Add(ins1); * Simbolo ter1 = new Simbolo(); * ter1.tipo = (int)Simbolo.Tipo.ETIQUETA; * ter1.nombre = temp1; * ter1.padre = nombreMetodo; * ter1.instruccion = ins1; * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar valor de " + objeto.nombre)); * C3D ins2 = new C3D((int)C3D.TipoC3D.ACCESO, nuevo.pila, nuevo.cadena, temp1); * instrucciones.Add(ins2); * Simbolo ter2 = new Simbolo(); * ter2.tipo = (int)Simbolo.Tipo.ETIQUETA; * ter2.nombre = nuevo.cadena; * ter2.padre = nombreMetodo; * ter2.instruccion = ins2; * if (enRetorno && !esParametro) * { * tablaSimbolos.Add(ter1); * tablaSimbolos.Add(ter2); * } * if (acceso.ChildNodes.Count > 0) * { * // SE HACE EL ACCESO! * if (objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA) * { * nuevo.padre = objeto.estructura; * nuevo = getAccesoC3D(nuevo, acceso, eError); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salto a salida")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); * generarEtiquetas((eError)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// NullPointerException")); * String taux = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "102")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, "0")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de exit")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "exit")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de exit")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * generarEtiquetas((eSalida)); * } * else * { * //Error! * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El objeto " + objeto.nombre + " no es una estructura, no se puede acceder!", * nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * } * return nuevo; * } * * //ACCESO! * public Nodo getAccesoC3D(Nodo objeto, ParseTreeNode accesos, String eError) * { * // ID (ACCESO -> .ID.ID.ID...) * // En objeto trae el valor en cadena y en padre trae el nombre del objeto a accesar * * foreach (ParseTreeNode acceso in accesos.ChildNodes) * { * int tipo = objeto.tipo; * String padre = objeto.padre; * if (tipo == (int)Simbolo.Tipo.ESTRUCTURA) * { * Simbolo atributo = tablaSimbolos.buscarAtributo(acceso.Token.Value.ToString(), padre); * if (atributo == null) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El atributo " + acceso.Token.Value.ToString() + * " no existe en " + objeto.padre + "!", acceso.Token.Location.Line, * acceso.Token.Location.Column)); * return null; * } * objeto.tipo = atributo.tipo; * objeto.padre = atributo.estructura; * // Realizar C3D * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Verificar que no sea NULL")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, objeto.cadena, "==", "-201314863.102494")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion de " + atributo.nombre)); * objeto.referencia = getTemporal(); * objeto.posicion = objeto.referencia; * objeto.pila = "Heap"; * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, objeto.referencia, objeto.cadena, "+", atributo.pos.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor de " + atributo.nombre)); * objeto.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", objeto.cadena, objeto.referencia)); * if (!(objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA)) * { * objeto.referencia = "error"; * } * } * else * { * //Error! No se puede acceder algo que no sea una estructura! * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El atributo " + padre + " no es una estructura, no se puede acceder!", * acceso.Token.Location.Line, * acceso.Token.Location.Column)); * return null; * } * * } * return objeto; * } * * // NATIVAS * public Nodo generarC3DNativas(ParseTreeNode nodo) * { * Nodo retorno = new Nodo(); * switch (nodo.ChildNodes.ElementAt(0).Term.Name) * { * case "inNum": * Nodo expN1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * Nodo expN2 = expresionC3D(nodo.ChildNodes.ElementAt(2)); * if (expN1 == null || expN2 == null) * { * return null; * } * String taux = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, expN1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, num")); * String tpar2 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2, taux, "+", "2")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2, expN2.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de inNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_inNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tpos = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpos, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tpos)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de inNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * case "getBool": * Nodo expB1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * if (expB1 == null) * { * return null; * } * String tauxB = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxB, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1B = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1B, tauxB, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1B, expB1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getBool")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getBool")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.BOOLEAN; * String tposB = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposB, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposB)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getBool")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * case "getNum": * Nodo expgN1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * Nodo expgN2 = expresionC3D(nodo.ChildNodes.ElementAt(2)); * Nodo expgN3 = expresionC3D(nodo.ChildNodes.ElementAt(3)); * if (expgN1 == null || expgN2 == null || expgN3 == null) * { * return null; * } * String tauxg = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxg, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1g = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1g, tauxg, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1g, expgN1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, referencia")); * String tpar2g = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2g, tauxg, "+", "2")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2g, expgN2.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del tercer parametro, num")); * String tpar3g = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar3g, tauxg, "+", "3")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar3g, expgN3.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tposg = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposg, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposg)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * case "getLength": * if (nodo.ChildNodes.Count == 2) * { * //getLength * Nodo expLN1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * if (expLN1 == null) * { * return null; * } * String tauxl = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxl, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1l = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1l, tauxl, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1l, expLN1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getStrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getStrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tposl = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposl, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposl)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getStrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * * } * else * { * //getLengthArreglo -> id num * String id = nodo.ChildNodes.ElementAt(1).Token.Value.ToString(); * Simbolo arreglo = tablaSimbolos.buscarVariable(id, nombreMetodo); * if (arreglo == null) * { * arreglo = tablaSimbolos.buscarGlobal(id); * if (arreglo == null) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El arreglo " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() + * " no ha sido declarado!", nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * } * if (arreglo.dims == -1) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() + * " no es de tipo areglo!", nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * int dimension = Convert.ToInt32(nodo.ChildNodes.ElementAt(2).Token.Value.ToString()); * int tam = tablaSimbolos.getTamanio(arreglo, dimension); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getArrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "getArrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, retorno.cadena, tam.ToString(), "", "")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getArrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * } * break; * default: * // getRandom * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getRandom")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getRandom")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tposr = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposr, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposr)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getRandom")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * } * * return retorno; * } */ //CASTEO DE EXPRESIONES! public static Nodo castearC3D(int tipo, Nodo nodo, int f, int c) { if (nodo == null) { return(null); } if (nodo.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nodo.etqFalsa == null && nodo.etqVerdadera == null) { nodo.tipo = (int)Simbolo.Tipo.NUMERO; } } if (nodo.tipo == tipo) { return(nodo); } else { Nodo nuevo = new Nodo(); switch (tipo) { case (int)Simbolo.Tipo.NUMERO: if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = tipo; return(nodo); } else { // CADENA o BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.CADENA) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente cadena a entero", f, c)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente booleano a entero", f, c)); } return(null); } case (int)Simbolo.Tipo.CARACTER: if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = tipo; return(nodo); } else { // CADENA o BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.CADENA) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente cadena a caracter", f, c)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente booleano a caracter", f, c)); } return(null); } case (int)Simbolo.Tipo.DECIMAL: if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.NUMERO) { nodo.tipo = tipo; return(nodo); } else { // CADENA o BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.CADENA) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente cadena a decimal", f, c)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente booleano a decimal", f, c)); } return(null); } case (int)Simbolo.Tipo.BOOLEAN: // BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.NUMERO) { nuevo.tipo = tipo; nuevo.etqVerdadera = GeneradorC3D.getEtiqueta(); nuevo.etqFalsa = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Castear num a bool")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nuevo.etqFalsa, nodo.cadena, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nuevo.etqVerdadera)); return(nuevo); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a bool", f, c)); return(null); } default: // CADENA Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a cadena", f, c)); return(null); } } }