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 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 expresionC3D(ParseTreeNode nodo) { switch (nodo.ChildNodes.Count) { #region "3 hijos" case 3: //EXP -> 3 hijos ParseTreeNode nder = nodo.ChildNodes[1]; String operador; if (nder.Term.Name.Equals("EXP")) { operador = nodo.ChildNodes[2].Token.Value.ToString(); } else { operador = nodo.ChildNodes[1].Token.Value.ToString(); nder = nodo.ChildNodes[2]; } if (operador.Equals("+") || operador.Equals("-") || operador.Equals("*") || operador.Equals("/") || operador.Equals("pow") || operador.Equals("^")) { //ARITMETICAS! Nodo aritmetica = Aritmetica.generarC3D(nodo.ChildNodes.ElementAt(0), operador, nder); if (aritmetica != null) { aritmetica.referencia = "error"; } return(aritmetica); } else if (operador.Equals("==") || operador.Equals("!=") || operador.Equals(">") || operador.Equals(">=") || operador.Equals("<") || operador.Equals("<=")) { //RELACIONALES! Nodo relacional = Relacional.generarC3D(nodo.ChildNodes.ElementAt(0), operador, nder); if (relacional != null) { relacional.referencia = "error"; } return(relacional); } else { //LOGICAS! Nodo logica = Logica.generarC3D(nodo.ChildNodes.ElementAt(0), operador, nder); if (logica != null) { logica.referencia = "error"; } return(logica); } #endregion #region "2 hijos" case 2: ParseTreeNode n1 = nodo.ChildNodes[0]; ParseTreeNode n2 = nodo.ChildNodes[1]; /* | EXP + ToTerm("-") | EXP + ToTerm("not") | ToTerm("-") + EXP | ToTerm("not") + EXP | super + punto + ACCESO | self + punto + ACCESO */ if (n1.Term.Name.Equals("super") || n1.Term.Name.Equals("este") || n1.Term.Name.Equals("this")) { // (super | self) ACCESO) if (n1.Term.Name.Equals("super")) { return(Acceso.generarC3DAcceso(n2, Acceso.Tipo.SUPER, null)); } else { return(Acceso.generarC3DAcceso(n2, Acceso.Tipo.NINGUNO, null)); } } else { // Ver si es de OLC++ o Tree if (n1.Term.Name.Equals("EXP")) { ParseTreeNode aux = n2; n2 = n1; n1 = aux; } if (n1.Term.Name.Equals("not") || n1.Term.Name.Equals("!")) { // NEGACION return(Logica.negacionC3D(n2)); } else { // UNARIO return(Aritmetica.unarioC3D(n2)); } } #endregion #region "1 hijo" default: //EXP -> 1 hijo String tipo = nodo.ChildNodes.ElementAt(0).Term.Name; Nodo nval = new Nodo(); switch (tipo) { case "NUEVO": // Generar codigo 3D de llamara a constructor return(Llamada.instanciaC3D(nodo.ChildNodes[0], Acceso.Tipo.NINGUNO)); case "NATIVAS": Nodo exp = expresionC3D(nodo.ChildNodes[1]); if (exp != null) { return(Convertidor.generarC3D(nodo.ChildNodes[0].Token.Text, exp)); } break; case "numero": nval.tipo = (int)Simbolo.Tipo.NUMERO; nval.cadena = nodo.ChildNodes.ElementAt(0).Token.Value.ToString(); if (nval.cadena.Contains(".")) { nval.tipo = (int)Simbolo.Tipo.DECIMAL; } return(nval); case "ACCESO": return(Acceso.generarC3DAcceso(nodo.ChildNodes[0], Acceso.Tipo.NINGUNO, null)); case "CRECE": return(Aritmetica.generarCrecimientoC3D(nodo.ChildNodes[0])); case "cadena": return(guardarCadenaC3D(nodo.ChildNodes[0].Token.Value.ToString().Replace("\"", ""))); case "caracter": nval.tipo = (int)Simbolo.Tipo.CARACTER; String cadena = nodo.ChildNodes[0].Token.Value.ToString().Replace("'", ""); int val = (int)cadena.ElementAt(0); nval.cadena = Convert.ToString(val); return(nval); case "BANDERA": return(Logica.banderaC3D(nodo.ChildNodes.ElementAt(0))); default: return(expresionC3D(nodo.ChildNodes.ElementAt(0))); } break; #endregion } return(null); }