Exemplo n.º 1
0
 public void TipoResultante(Tipo op1, Tipo op2)
 {
     if (!op1.IsIndefinido() && !op2.IsIndefinido())
     {
         if (Op == Operador.IGUAL || Op == Operador.DIFERENTE)
         {
             Tipo.Tip = Tipo.Type.BOOLEAN;
             return;
         }
         else
         {
             if ((op1.IsNumeric() || op1.IsBoolean()) && (op2.IsNumeric() || op2.IsBoolean()))
             {
                 Tipo.Tip = Tipo.Type.BOOLEAN;
                 return;
             }
             else if (op1.IsString() || op2.IsString())
             {
                 Tipo.Tip = Tipo.Type.BOOLEAN;
                 return;
             }
         }
     }
     Tipo.Tip = Tipo.Type.INDEFINIDO;
 }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
 private void TipoResultante(Tipo op1, Tipo op2)
 {
     if (!op1.IsIndefinido() && !op2.IsIndefinido())
     {
         if (op1.IsBoolean() && op2.IsBoolean())
         {
             Tipo.Tip = Tipo.Type.BOOLEAN;
             return;
         }
         else
         {
             Tipo.Tip = Tipo.Type.INT;
             return;
         }
     }
     Tipo.Tip = Tipo.Type.INDEFINIDO;
 }
Exemplo n.º 4
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;
 }
Exemplo n.º 5
0
        public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores)
        {
            Result result = new Result();

            Result rsOp1 = Op1.GetC3D(e, funcion, ciclo, isObjeto, errores);

            if (Op2 != null)
            {
                Result rsOp2 = Op2.GetC3D(e, funcion, ciclo, isObjeto, errores);

                TipoDominante(Op1.GetTipo(), Op2.GetTipo());

                if (!Tipo.IsIndefinido())
                {
                    result.Codigo += rsOp1.Codigo;
                    result.Codigo += rsOp2.Codigo;

                    if (Tipo.IsString())
                    {
                        if (!Op1.GetTipo().IsString())
                        {
                            ConvertirString(Op1, rsOp1, result);
                        }
                        if (!Op2.GetTipo().IsString())
                        {
                            ConvertirString(Op2, rsOp2, result);
                        }

                        result.EtiquetaV = NuevaEtiqueta();
                        result.EtiquetaF = NuevaEtiqueta();
                        string etqCiclo = NuevaEtiqueta();
                        string tmpCiclo = NuevoTemporal();
                        result.Valor = NuevoTemporal();

                        result.Codigo += result.Valor + " = H;\n";

                        result.Codigo += tmpCiclo + " = heap[" + rsOp1.Valor + "];\n";
                        result.Codigo += etqCiclo + ":\n";
                        result.Codigo += "if (" + tmpCiclo + " == 0) goto " + result.EtiquetaV + ";\n";
                        result.Codigo += "goto " + result.EtiquetaF + ";\n";
                        result.Codigo += result.EtiquetaF + ":\n";
                        result.Codigo += "heap[H] = " + tmpCiclo + ";\n";
                        result.Codigo += "H = H + 1;\n";
                        result.Codigo += rsOp1.Valor + " = " + rsOp1.Valor + " + 1;\n";
                        result.Codigo += tmpCiclo + " = heap[" + rsOp1.Valor + "];\n";
                        result.Codigo += "goto " + etqCiclo + ";\n";
                        result.Codigo += result.EtiquetaV + ":\n";

                        result.EtiquetaV = NuevaEtiqueta();
                        result.EtiquetaF = NuevaEtiqueta();
                        etqCiclo         = NuevaEtiqueta();
                        tmpCiclo         = NuevoTemporal();

                        result.Codigo += tmpCiclo + " = heap[" + rsOp2.Valor + "];\n";
                        result.Codigo += etqCiclo + ":\n";
                        result.Codigo += "if (" + tmpCiclo + " == 0) goto " + result.EtiquetaV + ";\n";
                        result.Codigo += "goto " + result.EtiquetaF + ";\n";
                        result.Codigo += result.EtiquetaF + ":\n";
                        result.Codigo += "heap[H] = " + tmpCiclo + ";\n";
                        result.Codigo += "H = H + 1;\n";
                        result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " + 1;\n";
                        result.Codigo += tmpCiclo + " = heap[" + rsOp2.Valor + "];\n";
                        result.Codigo += "goto " + etqCiclo + ";\n";
                        result.Codigo += result.EtiquetaV + ":\n";

                        result.Codigo += "heap[H] = 0;\n";
                        result.Codigo += "H = H + 1;\n";
                    }
                    else
                    {
                        switch (Op)
                        {
                        case Operador.SUMA:
                            result.Valor   = NuevoTemporal();
                            result.Codigo += result.Valor + " = " + rsOp1.Valor + " + " + rsOp2.Valor + ";\n";
                            break;

                        case Operador.RESTA:
                            result.Valor   = NuevoTemporal();
                            result.Codigo += result.Valor + " = " + rsOp1.Valor + " - " + rsOp2.Valor + ";\n";
                            break;

                        case Operador.MULTIPLICACION:
                            result.Valor   = NuevoTemporal();
                            result.Codigo += result.Valor + " = " + rsOp1.Valor + " * " + rsOp2.Valor + ";\n";
                            break;

                        case Operador.DIVISION:
                            result.Valor   = NuevoTemporal();
                            result.Codigo += result.Valor + " = " + rsOp1.Valor + " / " + rsOp2.Valor + ";\n";
                            break;

                        case Operador.MODULO:
                            result.Valor   = NuevoTemporal();
                            result.Codigo += result.Valor + " = " + rsOp1.Valor + " % " + rsOp2.Valor + ";\n";
                            break;

                        case Operador.FLOOR:
                            result.EtiquetaV = NuevaEtiqueta();
                            string etqSalida = NuevaEtiqueta();

                            if (Op1 is Literal)
                            {
                                string tmpOp1 = NuevoTemporal();
                                result.Codigo += tmpOp1 + " = " + rsOp1.Valor + ";\n";
                                rsOp1.Valor    = tmpOp1;
                            }
                            if (Op2 is Literal)
                            {
                                string tmpOp2 = NuevoTemporal();
                                result.Codigo += tmpOp2 + " = " + rsOp2.Valor + ";\n";
                                rsOp2.Valor    = tmpOp2;
                            }

                            result.Valor = NuevoTemporal();

                            result.Codigo += "if (" + rsOp2.Valor + " != 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo += "goto " + etqSalida + ";\n";
                            result.Codigo += result.EtiquetaV + ":\n";

                            string tmpCond = NuevoTemporal();
                            result.Codigo += tmpCond + " = 0;\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += "if (" + rsOp2.Valor + " > 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaF + ":\n";
                            result.Codigo   += tmpCond + " = 1;\n";
                            string menos = NuevoTemporal();
                            result.Codigo += menos + " = 0 - 1;\n";
                            result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " * " + menos + ";\n";
                            result.Codigo += result.EtiquetaV + ":\n";

                            string tmpCond2 = NuevoTemporal();
                            result.Codigo += tmpCond2 + " = 0;\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += "if (" + rsOp1.Valor + " >= 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaF + ":\n";
                            result.Codigo   += tmpCond2 + " = 1;\n";
                            menos            = NuevoTemporal();
                            result.Codigo   += menos + " = 0 - 1;\n";
                            result.Codigo   += rsOp1.Valor + " = " + rsOp1.Valor + " * " + menos + ";\n";
                            result.Codigo   += result.EtiquetaV + ":\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += result.Valor + " = 1;\n";
                            result.Codigo   += "if (" + rsOp2.Valor + " > " + rsOp1.Valor + ") goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaV + ":\n";
                            result.Codigo   += result.Valor + " = 0;\n";
                            result.Codigo   += result.EtiquetaF + ":\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            string etqCiclo = NuevaEtiqueta();
                            string tmp      = NuevoTemporal();

                            result.Codigo += tmp + " = " + rsOp1.Valor + " - " + rsOp2.Valor + ";\n";
                            result.Codigo += etqCiclo + ":\n";
                            result.Codigo += tmp + " = " + tmp + " - " + rsOp2.Valor + ";\n";
                            result.Codigo += "if (" + tmp + " >= 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo += result.EtiquetaV + ":\n";
                            result.Codigo += result.Valor + " = " + result.Valor + " + 1;\n";
                            result.Codigo += "goto " + etqCiclo + ";\n";
                            result.Codigo += result.EtiquetaF + ":\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += "if (" + tmpCond + " == 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaF + ":\n";
                            string etqVerd = result.EtiquetaV;

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += "if (" + tmpCond2 + " == 1) goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaF + ":\n";
                            result.Codigo   += result.Valor + " = " + result.Valor + " + 1;\n";
                            menos            = NuevoTemporal();
                            result.Codigo   += menos + " = 0 - 1;\n";
                            result.Codigo   += result.Valor + " = " + result.Valor + " * " + menos + ";\n";
                            result.Codigo   += etqVerd + ":\n";
                            result.Codigo   += result.EtiquetaV + ":\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += "if (" + tmpCond2 + " == 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaF + ":\n";
                            etqVerd          = result.EtiquetaV;

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            result.Codigo   += "if (" + tmpCond + " == 1) goto " + result.EtiquetaV + ";\n";
                            result.Codigo   += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo   += result.EtiquetaF + ":\n";
                            result.Codigo   += result.Valor + " = " + result.Valor + " + 1;\n";
                            menos            = NuevoTemporal();
                            result.Codigo   += menos + " = 0 - 1;\n";
                            result.Codigo   += result.Valor + " = " + result.Valor + " * " + menos + ";\n";
                            result.Codigo   += etqVerd + ":\n";
                            result.Codigo   += result.EtiquetaV + ":\n";

                            result.Codigo += etqSalida + ":\n";
                            break;

                        case Operador.POTENCIA:

                            if (Op1 is Literal)
                            {
                                string tmpOp1 = NuevoTemporal();
                                result.Codigo += tmpOp1 + " = " + rsOp1.Valor + ";\n";
                                rsOp1.Valor    = tmpOp1;
                            }
                            if (Op2 is Literal)
                            {
                                string tmpOp2 = NuevoTemporal();
                                result.Codigo += tmpOp2 + " = " + rsOp2.Valor + ";\n";
                                rsOp2.Valor    = tmpOp2;
                            }
                            else if (Op2 is Aritmetica)
                            {
                                if (((Aritmetica)Op2).Op2 == null && ((Aritmetica)Op2).Op == Operador.RESTA)
                                {
                                    Tipo.Tip = Tipo.Type.DOUBLE;
                                }
                            }

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            string factorNeg  = NuevoTemporal();
                            string nuevoValor = NuevoTemporal();
                            string etqSalida2 = NuevaEtiqueta();
                            //string etqError = NuevaEtiqueta();

                            result.Codigo += "if (" + rsOp2.Valor + " >= 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo += result.EtiquetaF + ":\n";
                            result.Codigo += factorNeg + " = 0 - 1;\n";
                            result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " * " + factorNeg + ";\n";
                            //result.Codigo += "if (" + rsOp1.Valor + " == 0) goto " + etqError + ";\n";/*0**-num*/
                            result.Codigo += nuevoValor + " = 1.0 / " + rsOp1.Valor + ";\n";
                            result.Codigo += "goto " + etqSalida2 + ";\n";
                            result.Codigo += result.EtiquetaV + ":\n";
                            result.Codigo += nuevoValor + " = " + rsOp1.Valor + ";\n";
                            result.Codigo += etqSalida2 + ":\n";

                            result.EtiquetaV = NuevaEtiqueta();
                            result.EtiquetaF = NuevaEtiqueta();
                            string etqCiclo2 = NuevaEtiqueta();
                            result.Valor = NuevoTemporal();

                            result.Codigo += result.Valor + " = 1;\n";
                            result.Codigo += etqCiclo2 + ":\n";
                            result.Codigo += "if (" + rsOp2.Valor + " <= 0) goto " + result.EtiquetaV + ";\n";
                            result.Codigo += "goto " + result.EtiquetaF + ";\n";
                            result.Codigo += result.EtiquetaF + ":\n";
                            result.Codigo += result.Valor + " = " + result.Valor + " * " + nuevoValor + ";\n";
                            result.Codigo += rsOp2.Valor + " = " + rsOp2.Valor + " - 1;\n";
                            result.Codigo += "goto " + etqCiclo2 + ";\n";
                            result.Codigo += result.EtiquetaV + ":\n";
                            break;
                        }
                    }
                }
                else
                {
                    errores.AddLast(new Error("Semántico", "Error de tipos en operación aritmética.", Linea, Columna));
                }
            }
            else
            {
                Tipo tipOp1 = Op1.GetTipo();
                if (tipOp1.IsNumeric() || tipOp1.IsBoolean())
                {
                    if (tipOp1.IsNumeric())
                    {
                        Tipo = Op1.GetTipo();
                    }
                    else
                    {
                        Tipo = new Tipo(Tipo.Type.INT);
                    }

                    result.Codigo += rsOp1.Codigo;
                    result.Valor   = NuevoTemporal();

                    switch (Op)
                    {
                    case Operador.SUMA:
                        result.Codigo += result.Valor + " = " + rsOp1.Valor + " * 1;\n";
                        break;

                    case Operador.RESTA:
                        result.Codigo += result.Valor + " = 0 - 1;\n";
                        string tmp = result.Valor;
                        result.Valor   = NuevoTemporal();
                        result.Codigo += result.Valor + " = " + rsOp1.Valor + " * " + tmp + ";\n";
                        break;
                    }
                }
                else
                {
                    errores.AddLast(new Error("Semántico", "Error de tipos en operación aritmética.", Linea, Columna));
                }
            }
            return(result);
        }
Exemplo n.º 6
0
        public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isObjeto, LinkedList <Error> errores)
        {
            Result result = new Result();

            if (Op1 is Relacional)
            {
                ((Relacional)Op1).Cortocircuito = true;
            }
            else if (Op1 is Logica)
            {
                ((Logica)Op1).Evaluar = true;
            }

            Result rsOp1 = Op1.GetC3D(e, funcion, ciclo, isObjeto, errores);

            if (Op2 != null)
            {
                if (Op2 is Relacional)
                {
                    ((Relacional)Op2).Cortocircuito = true;
                }
                else if (Op2 is Logica)
                {
                    ((Logica)Op2).Evaluar = true;
                }


                Result rsOp2 = Op2.GetC3D(e, funcion, ciclo, isObjeto, errores);

                TipoResultante(Op1.GetTipo(), Op2.GetTipo());

                if (!Tipo.IsIndefinido())
                {
                    if (Tipo.IsBoolean()) /*Si los dos son booleanos*/
                    {
                        if (Op1 is Literal)
                        {
                            rsOp1.EtiquetaV = NuevaEtiqueta();
                            rsOp1.EtiquetaF = NuevaEtiqueta();

                            rsOp1.Codigo    += "ifFalse (" + rsOp1.Valor + " == 1) goto " + rsOp1.EtiquetaV + ";\n";
                            rsOp1.Codigo    += "goto " + rsOp1.EtiquetaF + ";\n";
                            rsOp1.EtiquetaV += ":\n";
                            rsOp1.EtiquetaF += ":\n";
                        }

                        if (Op2 is Literal)
                        {
                            rsOp2.EtiquetaV = NuevaEtiqueta();
                            rsOp2.EtiquetaF = NuevaEtiqueta();

                            rsOp2.Codigo    += "ifFalse (" + rsOp2.Valor + " == 1) goto " + rsOp2.EtiquetaV + ";\n";
                            rsOp2.Codigo    += "goto " + rsOp2.EtiquetaF + ";\n";
                            rsOp2.EtiquetaV += ":\n";
                            rsOp2.EtiquetaF += ":\n";
                        }

                        if (Op == Operador.AND)
                        {
                            result.Codigo += rsOp1.Codigo;

                            if (Op1 is Relacional || Op1 is Literal)
                            {
                                result.Codigo  += rsOp1.EtiquetaF;
                                rsOp1.EtiquetaF = rsOp1.EtiquetaV;
                                rsOp1.EtiquetaV = null;
                            }
                            else if (Op1 is Logica)
                            {
                                result.Codigo  += rsOp1.EtiquetaV;
                                rsOp1.EtiquetaV = null;
                            }

                            result.Codigo += rsOp2.Codigo;

                            if (Op2 is Relacional || Op2 is Literal)
                            {
                                string copy = rsOp2.EtiquetaV;
                                rsOp2.EtiquetaV = rsOp2.EtiquetaF;
                                rsOp2.EtiquetaF = copy;
                            }

                            /*
                             * if(Op2 is Relacional)
                             *  result.Codigo += rsOp2.EtiquetaF;*/

                            if (!Evaluar)
                            {
                                result.Valor = NuevoTemporal();
                                string etiquetaS = NuevaEtiqueta();

                                if (rsOp1.EtiquetaV != null)
                                {
                                    result.Codigo += rsOp1.EtiquetaV;
                                }

                                if (rsOp2.EtiquetaV != null)
                                {
                                    result.Codigo += rsOp2.EtiquetaV;
                                }

                                result.Codigo += result.Valor + " = 1;\n";
                                result.Codigo += "goto " + etiquetaS + ";\n";

                                if (rsOp1.EtiquetaF != null)
                                {
                                    result.Codigo += rsOp1.EtiquetaF;
                                }

                                if (rsOp2.EtiquetaF != null)
                                {
                                    result.Codigo += rsOp2.EtiquetaF;
                                }

                                result.Codigo += result.Valor + " = 0;\n";
                                result.Codigo += etiquetaS + ":\n";
                            }
                            else
                            {
                                if (rsOp1.EtiquetaV != null)
                                {
                                    result.EtiquetaV += rsOp1.EtiquetaV;
                                }
                                if (rsOp1.EtiquetaF != null)
                                {
                                    result.EtiquetaF += rsOp1.EtiquetaF;
                                }
                                if (rsOp2.EtiquetaV != null)
                                {
                                    result.EtiquetaV += rsOp2.EtiquetaV;
                                }
                                if (rsOp2.EtiquetaF != null)
                                {
                                    result.EtiquetaF += rsOp2.EtiquetaF;
                                }
                            }
                        }
                        else
                        {
                            result.Codigo += rsOp1.Codigo;

                            if (Op1 is Relacional || Op1 is Literal)
                            {
                                result.Codigo  += rsOp1.EtiquetaV;
                                rsOp1.EtiquetaV = rsOp1.EtiquetaF;
                                rsOp1.EtiquetaF = null;
                            }
                            else if (Op1 is Logica)
                            {
                                result.Codigo  += rsOp1.EtiquetaF;
                                rsOp1.EtiquetaF = null;
                            }

                            result.Codigo += rsOp2.Codigo;

                            if (Op2 is Relacional || Op2 is Literal)
                            {
                                string copy = rsOp2.EtiquetaV;
                                rsOp2.EtiquetaV = rsOp2.EtiquetaF;
                                rsOp2.EtiquetaF = copy;
                            }

                            if (!Evaluar)
                            {
                                result.Valor = NuevoTemporal();
                                string etiquetaS = NuevaEtiqueta();

                                if (rsOp1.EtiquetaV != null)
                                {
                                    result.Codigo += rsOp1.EtiquetaV;
                                }

                                if (rsOp2.EtiquetaV != null)
                                {
                                    result.Codigo += rsOp2.EtiquetaV;
                                }

                                result.Codigo += result.Valor + " = 1;\n";
                                result.Codigo += "goto " + etiquetaS + ";\n";

                                if (rsOp1.EtiquetaF != null)
                                {
                                    result.Codigo += rsOp1.EtiquetaF;
                                }

                                if (rsOp2.EtiquetaF != null)
                                {
                                    result.Codigo += rsOp2.EtiquetaF;
                                }

                                result.Codigo += result.Valor + " = 0;\n";
                                result.Codigo += etiquetaS + ":\n";
                            }
                            else
                            {
                                if (rsOp1.EtiquetaV != null)
                                {
                                    result.EtiquetaV += rsOp1.EtiquetaV;
                                }
                                if (rsOp1.EtiquetaF != null)
                                {
                                    result.EtiquetaF += rsOp1.EtiquetaF;
                                }
                                if (rsOp2.EtiquetaV != null)
                                {
                                    result.EtiquetaV += rsOp2.EtiquetaV;
                                }
                                if (rsOp2.EtiquetaF != null)
                                {
                                    result.EtiquetaF += rsOp2.EtiquetaF;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (Op == Operador.AND)
                        {
                            if (Op2 is Literal && !Op2.GetTipo().IsNone())
                            {
                                result.Valor   = NuevoTemporal();
                                result.Codigo += result.Valor + " = " + rsOp2.Valor + ";\n";
                            }
                            else
                            {
                                result.Codigo += rsOp2.Codigo;
                                result.Valor   = rsOp2.Valor;

                                if (Op2 is Relacional || Op2 is Logica)
                                {
                                    if (!Evaluar)
                                    {
                                        result.Valor = NuevoTemporal();
                                        string etiquetaS = NuevaEtiqueta();

                                        if (rsOp2.EtiquetaV != null)
                                        {
                                            result.Codigo += rsOp2.EtiquetaV;
                                        }

                                        result.Codigo += result.Valor + " = 1;\n";
                                        result.Codigo += "goto " + etiquetaS + ";\n";

                                        if (rsOp2.EtiquetaF != null)
                                        {
                                            result.Codigo += rsOp2.EtiquetaF;
                                        }

                                        result.Codigo += result.Valor + " = 0;\n";
                                        result.Codigo += etiquetaS + ":\n";
                                    }
                                    else
                                    {
                                        result.EtiquetaV = rsOp2.EtiquetaV;
                                        result.EtiquetaF = rsOp2.EtiquetaF;
                                    }
                                }
                            }
                            Tipo = Op2.GetTipo();
                        }
                        else
                        {
                            if (Op1 is Literal && !Op1.GetTipo().IsNone())
                            {
                                result.Valor   = NuevoTemporal();
                                result.Codigo += result.Valor + " = " + rsOp1.Valor + ";\n";
                            }
                            else
                            {
                                result.Codigo += rsOp1.Codigo;
                                result.Valor   = rsOp1.Valor;

                                if (Op1 is Relacional || Op1 is Logica)
                                {
                                    if (!Evaluar)
                                    {
                                        result.Valor = NuevoTemporal();
                                        string etiquetaS = NuevaEtiqueta();

                                        if (rsOp1.EtiquetaV != null)
                                        {
                                            result.Codigo += rsOp1.EtiquetaV;
                                        }

                                        result.Codigo += result.Valor + " = 1;\n";
                                        result.Codigo += "goto " + etiquetaS + ";\n";

                                        if (rsOp1.EtiquetaF != null)
                                        {
                                            result.Codigo += rsOp1.EtiquetaF;
                                        }

                                        result.Codigo += result.Valor + " = 0;\n";
                                        result.Codigo += etiquetaS + ":\n";
                                    }
                                    else
                                    {
                                        result.EtiquetaV = rsOp1.EtiquetaV;
                                        result.EtiquetaF = rsOp1.EtiquetaF;
                                    }
                                }
                            }
                            Tipo = Op1.GetTipo();
                        }
                    }
                }
                else
                {
                    errores.AddLast(new Error("Semántico", "Error de tipos en operación lógica.", Linea, Columna));
                }
            }
            else /*NOT*/
            {
                Tipo.Tip = Tipo.Type.BOOLEAN;

                if (Op1.GetTipo().IsBoolean()) /*Boolean, exp logica y relacional*/
                {
                    if (Op1 is Literal)
                    {
                        rsOp1.EtiquetaV = NuevaEtiqueta();
                        rsOp1.EtiquetaF = NuevaEtiqueta();

                        rsOp1.Codigo    += "ifFalse (" + rsOp1.Valor + " == 1) goto " + rsOp1.EtiquetaV + ";\n";
                        rsOp1.Codigo    += "goto " + rsOp1.EtiquetaF + ";\n";
                        rsOp1.EtiquetaV += ":\n";
                        rsOp1.EtiquetaF += ":\n";
                    }

                    result.Codigo += rsOp1.Codigo;

                    if (!Evaluar)
                    {
                        result.Valor = NuevoTemporal();
                        string etiquetaS = NuevaEtiqueta();

                        if (rsOp1.EtiquetaV != null)
                        {
                            result.Codigo += rsOp1.EtiquetaV;
                        }

                        result.Codigo += result.Valor + " = 1;\n";
                        result.Codigo += "goto " + etiquetaS + ";\n";

                        if (rsOp1.EtiquetaF != null)
                        {
                            result.Codigo += rsOp1.EtiquetaF;
                        }

                        result.Codigo += result.Valor + " = 0;\n";
                        result.Codigo += etiquetaS + ":\n";
                    }
                    else
                    {
                        if (rsOp1.EtiquetaV != null)
                        {
                            result.EtiquetaF = rsOp1.EtiquetaV;
                        }
                        if (rsOp1.EtiquetaF != null)
                        {
                            result.EtiquetaV = rsOp1.EtiquetaF;
                        }
                    }
                }
                else
                {
                    if (Op1 is Literal)
                    {
                        string tmp = NuevoTemporal();
                        rsOp1.Codigo += tmp + " = " + rsOp1.Valor + ";\n";
                        rsOp1.Valor   = tmp;
                    }
                    if (Op1.GetTipo().IsString())
                    {
                        rsOp1.Codigo += rsOp1.Valor + " = 0 - 1;\n";
                    }

                    result.Codigo += rsOp1.Codigo;

                    if (!Evaluar)
                    {
                        result.EtiquetaV = NuevaEtiqueta();
                        result.EtiquetaF = NuevaEtiqueta();
                        result.Valor     = NuevoTemporal();

                        result.Codigo += result.Valor + " = 0;\n";
                        result.Codigo += "ifFalse (" + rsOp1.Valor + " == 0) goto " + result.EtiquetaV + ";\n";
                        result.Codigo += "goto " + result.EtiquetaF + ";\n";
                        result.Codigo += result.EtiquetaF + ":\n";
                        result.Codigo += result.Valor + " = 1;\n";
                        result.Codigo += result.EtiquetaV + ":\n";
                    }
                    else
                    {
                        result.EtiquetaV  = NuevaEtiqueta();
                        result.EtiquetaF  = NuevaEtiqueta();
                        result.Codigo    += "ifFalse (" + rsOp1.Valor + " == 0) goto " + result.EtiquetaF + ";\n";
                        result.Codigo    += "goto " + result.EtiquetaV + ";\n";
                        result.EtiquetaV += ":\n";
                        result.EtiquetaF += ":\n";
                    }
                }
            }

            return(result);
        }
Exemplo n.º 7
0
        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);
        }