示例#1
0
        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);
        }
示例#2
0
 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;
 }
示例#3
0
        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);
        }
示例#4
0
文件: Print.cs 项目: Oshhcar/Colette
        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);
        }