public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores) { Result result = new Result(); if (Tipo.IsInt() || Tipo.IsDouble() || Tipo.IsBoolean()) { result.Valor = Valor.ToString(); } else if (Tipo.IsNone()) { result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = 0 - 1;\n"; } else if (Tipo.IsString()) { /* * string tmp; * int cont = 0; * foreach (char c in Valor.ToString().Substring(1, Valor.ToString().Length - 2)) * { * tmp = NuevoTemporal(); * result.Codigo += tmp + " = H + " + cont++ + ";\n"; * result.Codigo += "heap[" + tmp + "] = " + (int)c + ";\n"; * * } * tmp = NuevoTemporal(); * result.Codigo += tmp + " = H + " + cont++ + ";\n"; * result.Codigo += "heap[" + tmp + "] = 0;\n"; * * result.Valor = NuevoTemporal(); * result.Codigo += result.Valor + " = H;\n"; * result.Codigo += "H = H + " + cont + ";\n"; */ result.Valor = NuevoTemporal(); result.Codigo += result.Valor + " = H;\n"; foreach (char c in Valor.ToString().Substring(1, Valor.ToString().Length - 2)) { result.Codigo += "heap[H] = " + (int)c + ";\n"; result.Codigo += "H = H + 1;\n"; } result.Codigo += "heap[H] = 0;\n"; result.Codigo += "H = H + 1;\n"; } return(result); }
public void TipoDominante(Tipo op1, Tipo op2) { if (!op1.IsIndefinido() && !op2.IsIndefinido()) { if (!op1.IsNone() && !op2.IsNone()) { if (op1.IsString() || op2.IsString()) { if (Op == Operador.SUMA) { Tipo.Tip = Tipo.Type.STRING; return; } } else //if (!op1.IsBoolean() && !op2.IsBoolean()) { if (op1.IsDouble() || op2.IsDouble()) { Tipo.Tip = Tipo.Type.DOUBLE; return; } else if (op1.IsInt() || op2.IsInt()) { Tipo.Tip = Tipo.Type.INT; return; } else if (op1.IsBoolean() || op2.IsBoolean()) { Tipo.Tip = Tipo.Type.INT; return; } } } } Tipo.Tip = Tipo.Type.INDEFINIDO; }
public override object GetValor(Entorno e, LinkedList <Salida> log, LinkedList <Error> errores) { object valExpr = Expr.GetValor(e, log, errores); if (valExpr != null) { if (valExpr is Throw) { return(valExpr); } if (Expr.Tipo.IsNull()) { if (Mostrar) { return(new Throw("NullPointerException", Linea, Columna)); } return(null); } if (Tipo.IsString()) { if (Expr.Tipo.IsString() || Expr.Tipo.IsInt() || Expr.Tipo.IsCounter() || Expr.Tipo.IsDouble() || Expr.Tipo.IsTime() || Expr.Tipo.IsDate() || Expr.Tipo.IsCollection()) { if (valExpr is Null) { return(valExpr); /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * //errores.AddLast(new Error("Semántico", "El String no ha sido inicializado.", Linea, Columna)); * //return valExpr; * return null;*/ } else { Cadena cad = new Cadena { Valor = valExpr.ToString() }; return(cad); } } } else if (Tipo.IsInt()) { if (Expr.Tipo.IsInt() || Expr.Tipo.IsCounter()) { return(valExpr); } else if (Expr.Tipo.IsDouble()) { try { return(Convert.ToInt32(Math.Truncate(Convert.ToDouble(valExpr)))); } catch (Exception ex) { Console.WriteLine("Exception Casteo: " + ex.Message.ToString()); } } else if (Expr.Tipo.IsString()) { if (!(valExpr is Null)) { if (int.TryParse(valExpr.ToString(), out int i)) { return(i); } } else { /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * //errores.AddLast(new Error("Semántico", "El String no ha sido inicializado.", Linea, Columna)); */ } } } else if (Tipo.IsDouble()) { if (Expr.Tipo.IsDouble()) { return(valExpr); } else if (Expr.Tipo.IsInt() || Expr.Tipo.IsCounter()) { return(Convert.ToDouble(valExpr)); } else if (Expr.Tipo.IsString()) { if (!(valExpr is Null)) { if (double.TryParse(valExpr.ToString(), out double d)) { return(d); } } else { /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * // errores.AddLast(new Error("Semántico", "El String no ha sido inicializado.", Linea, Columna)); */ } } } else if (Tipo.IsCounter()) { if (Expr.Tipo.IsInt() || Expr.Tipo.IsCounter()) { return(valExpr); } else if (Expr.Tipo.IsDouble()) { try { return(Convert.ToInt32(Math.Truncate(Convert.ToDouble(valExpr)))); } catch (Exception ex) { Console.WriteLine("Exception Casteo: " + ex.Message.ToString()); } } else if (Expr.Tipo.IsString()) { if (!(valExpr is Null)) { if (int.TryParse(valExpr.ToString(), out int i)) { return(i); } } else { /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * //errores.AddLast(new Error("Semántico", "El String no ha sido inicializado.", Linea, Columna)); */ } } } else if (Tipo.IsDate()) { if (Expr.Tipo.IsDate()) { return(valExpr); } else if (Expr.Tipo.IsString()) { if (!(valExpr is Null)) { Date date = new Date(valExpr.ToString()); if (date.Correcto) { return(date); } } else { return(valExpr); /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * //errores.AddLast(new Error("Semántico", "El String no ha sido inicializado.", Linea, Columna)); */ } } } else if (Tipo.IsTime()) { if (Expr.Tipo.IsTime()) { return(valExpr); } else if (Expr.Tipo.IsString()) { if (!(valExpr is Null)) { Time time = new Time(valExpr.ToString()); if (time.Correcto) { return(time); } } else { return(valExpr); /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * //errores.AddLast(new Error("Semántico", "El String no ha sido inicializado.", Linea, Columna)); * //return valExpr; * return null;*/ } } } else if (Tipo.IsCollection()) { if (Expr.Tipo.IsCollection()) { if (Tipo.EqualsCollection(Expr.Tipo)) { if (!(valExpr is Null)) { Collection collection = (Collection)valExpr; if (collection.Castear(Tipo, e, log, errores)) { return(collection); } } else { return(valExpr); /* * if (Mostrar) * return new Throw("NullPointerException", Linea, Columna); * return null;*/ } } } } if (Mostrar) { errores.AddLast(new Error("Semántico", "No se pudo castear la expresión a " + Tipo.Type.ToString() + ".", Linea, Columna)); } } Tipo = null; return(null); }
public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores) { if (!isDeclaracion) { Debugger(e, "Print"); } Result result = new Result(); if (!isDeclaracion) { Result rsExp = Expresion.GetC3D(e, funcion, ciclo, isObjeto, errores); Tipo tipoExp = Expresion.GetTipo(); if (!tipoExp.IsIndefinido()) { if (rsExp.Valor != null) { /*verificar objeto y todas las demas*/ result.Codigo += rsExp.Codigo; if (tipoExp.IsInt()) { if (Expresion is Literal) { string tmp = NuevoTemporal(); result.Codigo += tmp + " = " + rsExp.Valor + ";\n"; result.Codigo += "print(\"%i\"," + tmp + ");\n"; } else { result.Codigo += "print(\"%i\"," + rsExp.Valor + ");\n"; } } else if (tipoExp.IsDouble()) { if (Expresion is Literal) { string tmp = NuevoTemporal(); result.Codigo += tmp + " = " + rsExp.Valor + ";\n"; result.Codigo += "print(\"%f\"," + tmp + ");\n"; } else { result.Codigo += "print(\"%f\"," + rsExp.Valor + ");\n"; } } else if (tipoExp.IsBoolean()) { result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqSalida = NuevaEtiqueta(); string tmpCiclo = NuevoTemporal(); result.Codigo += "if (" + rsExp.Valor + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; result.Codigo += tmpCiclo + " = 70;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 97;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 108;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 115;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 101;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += "goto " + etqSalida + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += tmpCiclo + " = 84;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 114;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 117;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += tmpCiclo + " = 101;\n"; result.Codigo += "print(\"%c\", " + tmpCiclo + ");\n"; result.Codigo += etqSalida + ":\n"; } else if (tipoExp.IsString()) { result.EtiquetaV = NuevaEtiqueta(); result.EtiquetaF = NuevaEtiqueta(); string etqCiclo = NuevaEtiqueta(); string tmpCiclo = NuevoTemporal(); result.Codigo += etqCiclo + ":\n"; result.Codigo += tmpCiclo + " = heap[" + rsExp.Valor + "];\n"; result.Codigo += "if (" + tmpCiclo + " == 0) goto " + result.EtiquetaV + ";\n"; result.Codigo += "goto " + result.EtiquetaF + ";\n"; result.Codigo += result.EtiquetaF + ":\n"; result.Codigo += "print(\"%c\"," + tmpCiclo + ");\n"; result.Codigo += rsExp.Valor + " = " + rsExp.Valor + " + 1;\n"; result.Codigo += "goto " + etqCiclo + ";\n"; result.Codigo += result.EtiquetaV + ":\n"; } string tmpSalto = NuevoTemporal(); result.Codigo += tmpSalto + " = 10;\n"; result.Codigo += "print(\"%c\"," + tmpSalto + ");\n"; } else { if (tipoExp.IsNone()) { string tmp = NuevoTemporal(); result.Codigo += tmp + " = 78;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; result.Codigo += tmp + " = 111;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; result.Codigo += tmp + " = 110;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; result.Codigo += tmp + " = 101;\n"; result.Codigo += "print(\"%c\", " + tmp + ");\n"; string tmpSalto = NuevoTemporal(); result.Codigo += tmpSalto + " = 10;\n"; result.Codigo += "print(\"%c\"," + tmpSalto + ");\n"; } else { errores.AddLast(new Error("Semantico", "Valor no encontrado en print", Linea, Columna)); } } } } return(result); }