예제 #1
0
        public override object Execute(Ambit ambit)
        {
            //VERIFICA QUE LAS SENTNECIAS NO VENGAN VACIAS
            if (!sentence.IsNull)
            {
                var element = sentence.Execute(ambit);

                if (element != null)
                {
                    if (element is Instruction)
                    {
                        var inst = (Instruction)element;
                        if (inst.Name.Equals("Break") || inst.Name.Equals("Exit"))
                        {
                            return(element);
                        }
                    }
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                return(0);
            }

            return(0);
        }
예제 #2
0
        public override object Execute(Ambit ambit)
        {
            var ifAmbit = new Ambit(ambit, ambit.Ambit_name, "If", false);

            //CONDICION
            var condition = this.condition.Execute(ifAmbit);

            //VERIFICA QUE LLA CONDICION SEA BOOLEANA
            if (condition.getDataType != DataType.BOOLEAN)
            {
                setError("Semantico - La condicion del If no es booleana", row, column);
                return(null);
            }

            if ((bool)condition.Value == true)
            {
                if (sentences.IsNull)
                {
                    return(0);
                }
                return(this.sentences.Execute(ifAmbit));
            }
            else
            {
                if (elif.IsNull)
                {
                    return(0);
                }
                var elseAmbit = new Ambit(ambit, ambit.Ambit_name, "Else", false);
                return(elif.Execute(elseAmbit));
            }
        }
예제 #3
0
        public override Returned Execute(Ambit ambit)
        {
            var returned = new Returned();

            if (this.type == 1)
            {
                returned = new Returned(int.Parse(this.value.ToString()), DataType.INTEGER);
            }
            else if (this.type == 2)
            {
                returned = new Returned(this.value.ToString(), DataType.STRING);
            }

            else if (this.type == 3)
            {
                if (this.value.ToString() == "false")
                {
                    returned = new Returned(false, DataType.BOOLEAN);
                }
                else
                {
                    returned = new Returned(true, DataType.BOOLEAN);
                }
            }
            else if (this.type == 4)
            {
                returned = new Returned(double.Parse(this.value.ToString()), DataType.REAL);
            }

            else if (this.type == 7)
            {
                returned = new Returned(this.value.ToString(), DataType.IDENTIFIER);
            }
            return(returned);
        }
예제 #4
0
        public override object Execute(Ambit a)
        {
            var texto = "";

            foreach (var el in value)
            {
                var element = el.Execute(a);

                if (element.getDataType == DataType.ERROR)
                {
                    return(null);
                }
                else
                {
                    texto = texto + (element.Value.ToString()) + " ";
                }
            }
            if (this.isln)
            {
                texto = texto + "\n";
            }

            ConsolaController.Instance.Add(texto);
            return(0);
        }
예제 #5
0
        public override object Execute(Ambit ambit)
        {
            var newAmbit = new Ambit(ambit, ambit.Ambit_name, ambit.Ambit_name_inmediato, false);

            if (isNull)
            {
                return(0);
            }

            foreach (var inst in this.list)
            {
                try
                {
                    //EJECUTA LAS INSTRUCCIONES
                    var element = inst.Execute(newAmbit);

                    if (element == null)
                    {
                        return(null);
                    }
                    if (element is Instruction)
                    {
                        return(element);
                    }
                }
                catch (Exception ex)
                {
                    return(null);
                }
            }

            return(0);
        }
예제 #6
0
        public override object Execute(Ambit ambit)
        {
            var generator = C3D.C3DController.Instance;

            var switch_string = generator.save_comment("Inicia CASE", cant_tabs, false);

            //Condicion de switch
            var conSwitch = condicion.Execute(ambit);

            switch_string += conSwitch.Texto_anterior;



            var switchAmbit = new Ambit(ambit, ambit.Ambit_name + "_Case", "Case", false, ambit.IsFunction);

            switchAmbit.Break = generator.newLabel();

            for (int i = 0; i < cases.Count; i++)
            {
                var @case = (Case)cases[i];

                var condCase = @case.getCaseCondition(ambit);

                //CONDICION
                var condicion = new Relational(new Literal(conSwitch.Value.ToString(), GetDataType(conSwitch.getDataType), row, column, cant_tabs),
                                               new Literal(condCase.Value.ToString(), GetDataType(condCase.getDataType), row, column, cant_tabs), "=", row, column, cant_tabs);

                var cond = condicion.Execute(ambit);

                switch_string += cond.Texto_anterior;

                switch_string += generator.addLabel(condicion.TrueLabel, cant_tabs);
                var resultado = @case.Execute(switchAmbit);

                if (resultado == null)
                {
                    return(null);
                }


                switch_string += resultado;
                switch_string += generator.addLabel(condicion.FalseLabel, cant_tabs);
            }

            if (!else_case.IsNull)
            {
                var element = else_case.Execute(ambit);
                if (element == null)
                {
                    return(null);
                }
                switch_string += element;
            }
            switch_string += generator.addLabel(switchAmbit.Break, cant_tabs);
            switch_string  = generator.replace_temp(switchAmbit.Break, "LTEMP", switch_string);

            switch_string += generator.save_comment("Fin CASE", cant_tabs, true);
            return(switch_string);
        }
        public void graficarTSAmbit(Ambit ambit)
        {
            var res_graphi   = "";
            var ambito_name  = "";
            var ambito_name2 = ambit.Ambit_name.Replace("General_", "");
            var graphi       = "digraph G{\n";

            graphi += "label = \"" + "Ambito Graficado: " + ambito_name2 + "\"\n";

            graphi += "graph [pad=\"" + 0.5 + "\", nodesep=\"" + 0.5 + "\", ranksep=\"" + 2 + "\"]\nnode[shape = plain]\nrankdir = LR;\nBaz [label=<";


            graphi += "\n<table border=\"" + 0 + "\" cellborder=\"" + 1 + "\" cellspacing=\"" + 0 + "\">";


            graphi += "\n<tr>\n\t<td width='100'><i>Nombre</i></td>\n\t<td width='100'><i>Tipo</i></td>\n\t<td width='100'><i>Ambito</i></td>\n\t<td><i width='100'>Valor</i></td>\n\t<td><i width='100'>Tipo Objeto</i></td>\n</tr>\n";



            while (ambit != null)
            {
                if (ambit.Variables.Count > 0)
                {
                    foreach (var item in ambit.Variables)
                    {
                        Identifier id = (Identifier)item.Value;
                        ambito_name = ambit.Ambit_name.Replace("General_", "");
                        res_graphi  = "\n<tr>\n\t<td height='25'>" + id.Id + "</td>\n\t<td height='25'>" + id.DataType + "</td>\n\t<td height='25'>" + ambito_name + "</td>\n\t<td height='25'>" + id.Value.ToString() + "</td>\n\t<td height='25'>" + id.Tipo_dato + "</td>\n</tr>" + res_graphi;
                    }
                }

                if (ambit.Functions.Count > 0)
                {
                    var type   = "void";
                    var isfunc = "Procedure";

                    foreach (var item in ambit.Functions)
                    {
                        type   = "void";
                        isfunc = "Procedure";

                        Function func = (Function)item.Value;
                        if (!func.IsProcedure)
                        {
                            isfunc = "Function";
                            type   = func.Tipe.ToString();
                        }
                        res_graphi = "<tr>\n<td height='25'>" + func.Id + "</td>\n<td height='25'>" + type + "</td>\n<td height='25'>" + ambit.Ambit_name + "</td>\n<td height='25'>" + func.Retorno.ToString() + "</td>\n<td height='25'>" + isfunc + "</td>\n</tr>" + res_graphi;
                    }
                }
                var temp = ambit.anterior;
                ambit = temp;
            }

            graphi += res_graphi + "\n</table>>];\n" + "}";


            print_image(this.path, "tabla_simbolos", ambito_name2, graphi);
        }
예제 #8
0
        public override object Execute(Ambit ambit)
        {
            Identifier buscar = new Identifier();

            //BUSCA LA VARIABLE SI NO HA SIDO DECLARADA
            if (!ambit.Ambit_name_inmediato.Equals("Function") && !ambit.Ambit_name_inmediato.Equals("Procedure"))
            {
                buscar = ambit.getVariable(id);
            }
            //SIGFINICA QUE ES UNA DECLARACION EN FUNCION
            else
            {
                buscar = ambit.getVariableFunctionInAmbit(id);
            }

            if (buscar.IsNull)
            {
                try
                {
                    Returned val = this.value.Execute(ambit);

                    //VERIFICA QUE NO HAYA ERROR
                    if (val.getDataType == DataType.ERROR)
                    {
                        return(null);
                    }


                    if (this.type == DataType.CONST)
                    {
                        ambit.save(this.id, val.Value, val.getDataType, true, true, "Constante");
                        return(val.Value);
                    }
                    else
                    {
                        if (val.getDataType == this.type)
                        {
                            ambit.save(this.id, val.Value, val.getDataType, false, isAssigned, "Variable");
                            return(val.Value);
                        }
                        else
                        {
                            set_error("El tipo " + val.getDataType + " no es asignable con " + this.type.ToString(), row, column);
                            return(null);
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
            else
            {
                set_error("La variable '" + id + "' ya fue declarada", row, column);
                return(null);
            }
            return(0);
        }
예제 #9
0
        public void saveFunc(Ambit ambit)
        {
            if (ambit.Anterior != null)
            {
                this.UniqId = ambit.Ambit_name + "_" + id;
            }

            ambit.saveFuncion(this.id, this);
        }
예제 #10
0
        public override object Execute(Ambit ambit)
        {
            //Condicion de switch
            var conSwitch = condicion.Execute(ambit);


            var numeroCaso = -1;


            var switchAmbit = new Ambit(ambit, ambit.Ambit_name, "Case", false);

            for (int i = 0; i < cases.Count; i++)
            {
                var condCase = ((Case)(cases[i])).getCaseCondition(ambit);

                if (conSwitch.Value.ToString() == condCase.Value.ToString())
                {
                    numeroCaso = i;


                    var element   = (Case)cases[i];
                    var resultado = element.Execute(switchAmbit);

                    if (resultado == null)
                    {
                        return(null);
                    }
                    if (resultado is Instruction)
                    {
                        var inst = (Instruction)resultado;
                        if (inst.Name.Equals("Break") || inst.Name.Equals("Exit"))
                        {
                            return(resultado);
                        }
                    }
                    break;
                }
            }

            if (numeroCaso == -1)
            {
                if (!else_case.IsNull)
                {
                    var element = else_case.Execute(ambit);
                    if (element == null)
                    {
                        return(null);
                    }
                    return(element);
                }
            }


            return(0);
        }
예제 #11
0
        public override Returned Execute(Ambit ambit)
        {
            var result    = new Returned();
            var operacion = GetOpLogical(this.type);



            if (operacion != OpLogical.NOT)
            {
                var varIz  = this.left.Execute(ambit);
                var valDer = right.Execute(ambit);
                if (varIz.Value is bool && valDer.Value is bool)
                {
                    var izq = (bool)(varIz.Value);

                    switch (operacion)
                    {
                    case OpLogical.AND:
                        var der = (bool)(valDer.Value);
                        result = new Returned((izq && der), DataType.BOOLEAN);
                        break;

                    case OpLogical.OR:
                        var valDere = right.Execute(ambit);
                        var dere    = (bool)(valDere.Value);
                        result = new Returned((izq || dere), DataType.BOOLEAN);
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + varIz.getDataType + " con " + valDer.getDataType, 0, 0);
                    return(new Returned());
                }
            }
            else
            {
                var varIz = this.left.Execute(ambit);
                if (varIz.Value is bool)
                {
                    var izq = (bool)(varIz.Value);
                    result = new Returned(!(izq), DataType.BOOLEAN);
                }
                else
                {
                    set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + varIz.getDataType, 0, 0);
                    return(new Returned());
                }
            }
            return(result);
        }
 //METODO PARA SINTETIZAR VALORES
 public void sintetizar_referencia(Ambit ambit, Function funcion_llamada)
 {
     if (funcion_llamada.Parametros_referencia.Count > 0)
     {
         foreach (SimboloReferencia simbolo in funcion_llamada.Parametros_referencia)
         {
             var variable = ambit.getVariableFunctionInAmbit(simbolo.Actual);
             ambit.setVariableInAmbit(simbolo.Padre, variable.Value, variable.DataType, false, "Variable");
         }
         funcion_llamada.Parametros_referencia.Clear();
     }
 }
예제 #13
0
        public override object Execute(Ambit ambit)
        {
            var while_string      = "";
            var generator         = C3D.C3DController.Instance;
            var whileAmbit        = new Ambit(ambit, ambit.Ambit_name, "While", false, ambit.IsFunction);
            var label_recurrencia = generator.newLabel();

            while_string += generator.save_comment("Inicia While", cant_tabs, false);
            while_string += generator.addLabel(label_recurrencia, cant_tabs);


            //CONDICION
            var cond = condition.Execute(whileAmbit);

            while_string += cond.Texto_anterior;

            if (cond.getDataType != DataType.BOOLEAN)
            {
                set_error("La condicion del While no es booleana", row, column);
                return(null);
            }

            whileAmbit.Break    = cond.FalseLabel;
            whileAmbit.Continue = label_recurrencia;

            //TAG VERDADERA
            while_string += generator.addLabel(cond.TrueLabel, cant_tabs);


            //EJECUTA SENTENCIAS
            var result = this.sentences.Execute(whileAmbit);

            if (result == null)
            {
                return(null);
            }
            while_string += result;

            while_string += generator.add_Goto(label_recurrencia, cant_tabs + 1);

            while_string += generator.addLabel(cond.FalseLabel, cant_tabs);
            while_string += generator.save_comment("Fin while", cant_tabs, true);



            return(while_string);
        }
        public override object Execute(Ambit ambit)
        {
            try
            {
                var val = this.value.Execute(ambit);

                if (val == null || val.getDataType == DataType.ERROR)
                {
                    return(null);
                }

                Identifier variable = ambit.getVariable(id);

                /**
                 * VALIDAR EXISTENCIA
                 */
                if (!variable.IsNull)
                {
                    /**
                     * VERIFICA QUE NO SEA CONSTABTE
                     */
                    if (variable.Esconstante)
                    {
                        setError("No se puede cambiar el valor a una constante", row, column);
                        return(null);
                    }
                    else
                    {
                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (variable.DataType == val.getDataType)
                        {
                            ambit.setVariable(id, val.Value, val.getDataType, false, "Variable");
                            return(variable.Value);
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + variable.DataType, row, column);
                            return(null);
                        }
                    }
                }
                else
                {
                    Function function = ambit.getFuncion(id);

                    if (function != null)
                    {
                        if (function.IsProcedure)
                        {
                            setError("No puede asignarse ningun valor al procedimiento '" + id + "' ", row, column);
                            return(null);
                        }

                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (function.Tipe == val.getDataType)
                        {
                            function.Retorno = val.Value.ToString();
                            ambit.setFunction(Id, function);
                            return(new Returned(function.Retorno, function.Tipe));
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + variable.DataType, row, column);
                            return(null);
                        }
                    }
                    else
                    {
                        setError("La variable '" + id + "' no esta declara", row, column);
                        return(null);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                ConsolaController.Instance.Add("Recuperado de error, Row:" + row + " Col: " + column);
                return(null);
            }
        }
예제 #15
0
        public override object Execute(Ambit ambit)
        {
            var repeatAmbit = new Ambit(ambit, ambit.Ambit_name, "Repeat", false);


            //CONDICION
            var condicion = condition.Execute(repeatAmbit);

            //VERIFICA QUE SEA BOOL
            if (condicion.getDataType != DataType.BOOLEAN)
            {
                set_error("La condicion del repeat no es booleana", row, column);
                return(null);
            }



            if (!sentences.IsNull)
            {
                do
                {
                    var element = sentences.Execute(repeatAmbit);

                    ////VERIFICA QUE NO HAYA ERROR
                    if (element == null)
                    {
                        return(null);
                    }

                    //VUELVE A EVALUAR LA CONDICION
                    condicion = this.condition.Execute(repeatAmbit);
                    if (condicion.getDataType != DataType.BOOLEAN)
                    {
                        set_error("La condicion del repeat no es booleana", row, column);
                        return(null);
                    }

                    //EVALUA LO QUE VIENE
                    if (element is Instruction)
                    {
                        Instruction inst = (Instruction)element;
                        if (inst.Name.Equals("Break"))
                        {
                            break;
                        }
                        else if (inst.Name.Equals("Continue"))
                        {
                            continue;
                        }
                        else if (inst.Name.Equals("Exit"))
                        {
                            return(element);
                        }
                    }
                } while ((bool)condicion.Value == false);
            }
            else
            {
                return(0);
            }

            return(0);
        }
예제 #16
0
        public override object Execute(Ambit ambit)
        {
            try
            {
                var val = this.value.Execute(ambit);

                if (val == null || val.getDataType == DataType.ERROR)
                {
                    return(null);
                }
                //VERIFICO LA EXISTENCIA
                Arrays arr = ambit.getArray(id);

                if (arr != null)
                {
                    if (arr.DataType == val.getDataType)
                    {
                        var ind       = index.Execute(ambit);
                        var limiteinf = arr.Inf.Execute(ambit);
                        var larraysup = arr.Sup.Execute(ambit);

                        var inferior = int.Parse(limiteinf.Value.ToString());
                        var superior = int.Parse(larraysup.Value.ToString());
                        var indice   = int.Parse(ind.Value.ToString());


                        if (indice < inferior || indice > superior)
                        {
                            setError("Indice fuera de rango al acceder al arreglo '" + this.id + "'", row, column);
                            return(null);
                        }



                        try
                        {
                            switch (arr.DataType)
                            {
                            case DataType.INTEGER:
                                arr.Elementos[indice] = int.Parse(val.Value.ToString());
                                break;

                            case DataType.STRING:
                                arr.Elementos[indice] = val.Value.ToString();
                                break;

                            case DataType.BOOLEAN:
                                arr.Elementos[indice] = (bool)val.Value;
                                break;

                            case DataType.REAL:
                                arr.Elementos[indice] = double.Parse(val.Value.ToString());
                                break;

                            default:
                                break;
                            }
                        }
                        catch (Exception e)
                        {
                            ConsolaController.Instance.Add(e.Message + "\n");
                        }


                        ambit.setArray(id, arr);
                        return(val.Value);
                    }
                    else
                    {
                        setError("El tipo " + val.getDataType + " no es asignable con " + arr.DataType, row, column);
                        return(null);
                    }
                }
                else
                {
                    setError("El arreglo '" + id + "' no esta declaro", row, column);
                    return(null);
                }
            }
            catch (Exception)
            {
                return(null);
            }
        }
예제 #17
0
        public override object Execute(Ambit ambit)
        {
            var whileAmbit = new Ambit(ambit, ambit.Ambit_name, "While", false);

            //CONDICION
            var cond = condition.Execute(whileAmbit);

            if (cond.getDataType != DataType.BOOLEAN)
            {
                set_error("La condicion del While no es booleana", row, column);
                return(null);
            }


            while ((bool)cond.Value == true)
            {
                //VERIFICA QUE LA SENTENCIA NO ESTE VACIA
                if (!sentences.IsNull)
                {
                    //EJECUTA LA SENTENCIA
                    var element = sentences.Execute(whileAmbit);

                    //VERIFICA QUE NO HAYA ERROR
                    if (element == null)
                    {
                        return(null);
                    }
                    //VUELVE A EVALUAR LA CONDICION
                    cond = condition.Execute(whileAmbit);
                    if (cond.getDataType != DataType.BOOLEAN)
                    {
                        set_error("La condicion del While no es booleana", row, column);
                        return(null);
                    }

                    if (element is Instruction)
                    {
                        Instruction ins = (Instruction)element;

                        //console.log(element);
                        if (ins.Name.Equals("Break"))
                        {
                            break;
                        }
                        else if (ins.Name.Equals("Continue"))
                        {
                            continue;
                        }
                        else if (ins.Name.Equals("Exit"))
                        {
                            return(element);
                        }
                    }
                }
                else
                {
                    break;
                }
            }

            return(0);
        }
예제 #18
0
        public override Returned Execute(Ambit ambit)
        {
            var logical_str = "";
            var result      = new Returned();
            var operacion   = GetOpLogical(this.type);

            //INSTANCIA DEL GENERADOR C3D
            var generator = C3DController.Instance;

            if (this.TrueLabel == "")
            {
                this.TrueLabel = generator.newLabel();
            }
            if (this.FalseLabel == "")
            {
                this.FalseLabel = generator.newLabel();
            }


            logical_str += generator.save_comment("Empieza " + operacion, cant_tabs, false);
            switch (operacion)
            {
            case OpLogical.AND:
                this.left.TrueLabel  = this.TrueLabel;
                this.left.FalseLabel = this.FalseLabel;

                //EXPRESIONES
                var varIz = this.left.Execute(ambit);

                logical_str += varIz.Texto_anterior;

                if (varIz.getDataType == DataType.BOOLEAN)
                {
                    logical_str += generator.addLabel(varIz.TrueLabel, cant_tabs);

                    this.right.TrueLabel  = generator.newLabel();
                    this.right.FalseLabel = varIz.FalseLabel;

                    var valDer = right.Execute(ambit);
                    logical_str += valDer.Texto_anterior;

                    if (valDer.getDataType != DataType.BOOLEAN)
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado alos tipos " + varIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                    logical_str += generator.save_comment("Termina " + operacion, cant_tabs, true);
                    return(new Returned("", DataType.BOOLEAN, false, valDer.TrueLabel, valDer.FalseLabel, logical_str, "false", 0, 0));
                }
                set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + varIz.getDataType, row, column);
                return(result);


            case OpLogical.OR:
                this.left.TrueLabel  = this.TrueLabel;
                this.left.FalseLabel = this.FalseLabel;

                //EXPRESIONES
                var valIz = this.left.Execute(ambit);
                logical_str += valIz.Texto_anterior;
                if (valIz.getDataType == DataType.BOOLEAN)
                {
                    logical_str += generator.addLabel(valIz.FalseLabel, cant_tabs);

                    this.right.TrueLabel  = valIz.TrueLabel;
                    this.right.FalseLabel = generator.newLabel();

                    var valDer = right.Execute(ambit);
                    logical_str += valDer.Texto_anterior;

                    if (valDer.getDataType != DataType.BOOLEAN)
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado alos tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                    logical_str += generator.save_comment("Termina " + operacion, cant_tabs, true);
                    return(new Returned("", DataType.BOOLEAN, false, valDer.TrueLabel, valDer.FalseLabel, logical_str, "false", 0, 0));
                }
                set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + valIz.getDataType, row, column);
                return(result);


            case OpLogical.NOT:


                this.left.TrueLabel  = this.FalseLabel;
                this.left.FalseLabel = this.TrueLabel;

                //EXPRESIONES
                var varrIz = this.left.Execute(ambit);
                logical_str += varrIz.Texto_anterior;
                if (varrIz.getDataType != DataType.BOOLEAN)
                {
                    set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + varrIz.getDataType, row, column);
                    return(result);
                }
                logical_str += generator.save_comment("Termina " + operacion, cant_tabs, true);
                return(new Returned("", DataType.BOOLEAN, false, varrIz.FalseLabel, varrIz.TrueLabel, logical_str, "false", 0, 0));



            default:
                break;
            }


            return(result);
        }
예제 #19
0
 public Returned getCaseCondition(Ambit ambit)
 {
     return(this.condition.Execute(ambit));
 }
예제 #20
0
        public override object Execute(Ambit ambit)
        {
            var generator = C3D.C3DController.Instance;

            if (!this.isProcedure)
            {
                generator.update_posision_global();
            }

            var funcion_total = generator.save_code("void " + uniqId + "(" + ") { \n", 0);



            var tempo_return = "";
            var exit_label   = "";
            var size         = 0;

            if (!IsProcedure)
            {
                tempo_return   = "T13";
                exit_label     = generator.newLabel();
                funcion_total += generator.save_code("//Temporal de retorno", 1);
                funcion_total += generator.addExpression(tempo_return, "SP", "0", "+", 1);
                size           = 1;
            }
            //AMBITO DE LA FUNCION
            Ambit ambit_func = new Ambit(ambit, this.uniqId, tipo, tempo_return, exit_label, !isProcedure, this.tipe, size);


            foreach (Declaration dec in parametos)
            {
                ambit_func.saveVarFunction(dec.Id, "0", "0", dec.Type, dec.isRefer, "Parameter", 0);
            }

            funcion_total += generator.save_comment("Inicia Declaracion de variables", 1, false);
            //DECLARACIONES
            foreach (var declas in declaraciones)
            {
                var result = declas.Execute(ambit_func);
                if (result == null)
                {
                    return(null);
                }
                funcion_total += result;
            }
            funcion_total += generator.save_comment("Fin Declaracion de variables", 1, false);

            //FUNCIONES HIJAS
            foreach (Function fun_hija in funciones_hijas)
            {
                fun_hija.saveFunc(ambit_func);
            }

            var funcion_hija = "";

            foreach (Function fun_hija in funciones_hijas)
            {
                fun_hija.Variables_padres = this.declaraciones;
                var result = fun_hija.Execute(ambit_func);
                if (result == null)
                {
                    return(null);
                }
                funcion_hija += result;
            }

            //INSTRUCCIONES
            foreach (Instruction instruction in sentences)
            {
                var instruccion = instruction.Execute(ambit_func);

                if (instruccion == null)
                {
                    return(null);
                }
                funcion_total += instruccion;
            }


            if (!isProcedure)
            {
                funcion_total += generator.addLabel(exit_label, 1);
            }

            funcion_total += generator.save_code(" return;\n", 2);
            funcion_total += generator.save_code("}\n", 0);



            ReporteController.Instance.save_ambit(ambit_func, ambit_func.Ambit_name);



            return(funcion_hija + funcion_total);
        }
        public override Returned Execute(Ambit ambit)
        {
            var relational_Str = "";
            var valIz          = this.left.Execute(ambit);

            relational_Str += valIz.Texto_anterior;

            var result = new Returned();

            var generator = C3DController.Instance;

            var op = GetType(this.type);

            switch (op)
            {
            case OpRelational.EQUALS:
                relational_Str += generator.save_comment("Empieza EQUALS", cant_tabs, false);
                //VERIFICA SI EL IZQUIERDO ES REAL O INT
                if (valIz.getDataType == DataType.REAL || valIz.getDataType == DataType.INTEGER)
                {
                    var valDer = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    if (valDer.getDataType == DataType.INTEGER || valDer.getDataType == DataType.REAL)
                    {
                        if (this.TrueLabel == "")
                        {
                            this.TrueLabel = generator.newLabel();
                        }
                        if (this.FalseLabel == "")
                        {
                            this.FalseLabel = generator.newLabel();
                        }
                        ambit.free_temp(valIz.getValue());
                        ambit.free_temp(valDer.getValue());

                        relational_Str += generator.add_If(valIz.getValue(), valDer.getValue(), "==", this.TrueLabel, cant_tabs);
                        relational_Str += generator.add_Goto(this.FalseLabel, cant_tabs);
                        relational_Str += generator.save_comment("Termina EQUALS", cant_tabs, true);

                        result = new Returned("", DataType.BOOLEAN, false, this.TrueLabel, this.FalseLabel, relational_Str, "", 0, 0);
                    }
                    else
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                }
                //VERIFICA SI EL IZQUIERDO ES BOOLEAN
                else if (valIz.getDataType == DataType.BOOLEAN)
                {
                    var trueLabel  = generator.newLabel();
                    var falseLabel = generator.newLabel();
                    relational_Str       += generator.addLabel(valIz.TrueLabel, cant_tabs);
                    this.right.TrueLabel  = trueLabel;
                    this.right.FalseLabel = falseLabel;
                    var valDer = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    relational_Str += generator.addLabel(valIz.FalseLabel, cant_tabs);

                    this.right.TrueLabel  = falseLabel;
                    this.right.FalseLabel = trueLabel;
                    valDer          = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    //VERIFICA QUE EL DERECHO SEA BOOLEAN
                    if (valDer.getDataType == DataType.BOOLEAN)
                    {
                        relational_Str += generator.save_comment("Termina EQUALS", cant_tabs, true);
                        ambit.free_temp(valIz.getValue());
                        ambit.free_temp(valDer.getValue());
                        result = new Returned("", DataType.BOOLEAN, false, trueLabel, falseLabel, relational_Str, "", 0, 0);
                    }
                    else
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                }
                ////VERIFICA QUE EL IZQUIERDO SEA STRING
                else if (valIz.getDataType == DataType.STRING)
                {
                    generator.Native_equals = true;

                    var valDer = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;


                    if (valDer.getDataType == DataType.STRING)
                    {
                        if (this.TrueLabel == "")
                        {
                            this.TrueLabel = generator.newLabel();
                        }
                        if (this.FalseLabel == "")
                        {
                            this.FalseLabel = generator.newLabel();
                        }



                        var tempo_izq = valIz.Value.ToString();
                        var tempo_der = valDer.Value.ToString();

                        relational_Str += generator.addExpression("T3", tempo_izq, "", "", cant_tabs);
                        relational_Str += generator.addExpression("T4", tempo_der, "", "", cant_tabs);
                        relational_Str += generator.addExpression("T8", "native_cmp_str()", "", "", cant_tabs);
                        relational_Str += generator.add_If("T8", "1", "==", this.TrueLabel, cant_tabs);
                        relational_Str += generator.add_Goto(this.FalseLabel, cant_tabs);

                        ambit.free_temp(tempo_der);
                        ambit.free_temp(tempo_izq);

                        relational_Str += generator.save_comment("Termina EQUALS", cant_tabs, true);

                        result = new Returned("", DataType.BOOLEAN, false, this.TrueLabel, this.FalseLabel, relational_Str, "", 0, 0);
                    }
                    else
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                }

                else
                {
                    set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + valIz.getDataType, row, column);
                    return(result);
                }


                break;

            case OpRelational.DISCTINCT:
                relational_Str += generator.save_comment("Empieza DISTICT", cant_tabs, false);

                //VERIFICA QUE EL IZQUIERDO ESA REAL O INTEGER
                if (valIz.getDataType == DataType.REAL || valIz.getDataType == DataType.INTEGER)
                {
                    var valDer = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    if (valDer.getDataType == DataType.INTEGER || valDer.getDataType == DataType.REAL)
                    {
                        if (this.TrueLabel == "")
                        {
                            this.TrueLabel = generator.newLabel();
                        }
                        if (this.FalseLabel == "")
                        {
                            this.FalseLabel = generator.newLabel();
                        }
                        ambit.free_temp(valIz.getValue());
                        ambit.free_temp(valDer.getValue());
                        relational_Str += generator.add_If(valIz.getValue(), valDer.getValue(), "!=", this.TrueLabel, cant_tabs);
                        relational_Str += generator.add_Goto(this.FalseLabel, cant_tabs);
                        relational_Str += generator.save_comment("Termina DISTICT", cant_tabs, true);
                        result          = new Returned("", DataType.BOOLEAN, false, this.TrueLabel, this.FalseLabel, relational_Str, "", 0, 0);
                    }
                    else
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                }
                else if (valIz.getDataType == DataType.BOOLEAN)
                {
                    var trueLabel  = generator.newLabel();
                    var falseLabel = generator.newLabel();
                    relational_Str       += generator.addLabel(valIz.TrueLabel, cant_tabs);
                    this.right.TrueLabel  = falseLabel;
                    this.right.FalseLabel = trueLabel;
                    var valDer = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    relational_Str += generator.addLabel(valIz.FalseLabel, cant_tabs);

                    this.right.TrueLabel  = trueLabel;
                    this.right.FalseLabel = falseLabel;
                    valDer          = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    //VERIFICA QUE EL DERECHO SEA BOOLEAN
                    if (valDer.getDataType == DataType.BOOLEAN)
                    {
                        ambit.free_temp(valIz.getValue());
                        ambit.free_temp(valDer.getValue());
                        relational_Str += generator.save_comment("Termina DISTICT", cant_tabs, true);
                        result          = new Returned("", DataType.BOOLEAN, false, trueLabel, falseLabel, relational_Str, "", 0, 0);
                    }
                    else
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                }
                else
                {
                    set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + valIz.getDataType, row, column);
                    return(result);
                }

                break;

            case OpRelational.LESS:
            case OpRelational.LESS_EQUALS:
            case OpRelational.HIGHER:
            case OpRelational.HIGHER_EQUALS:
                relational_Str += generator.save_comment("Empieza " + op, cant_tabs, false);
                if (valIz.getDataType == DataType.REAL || valIz.getDataType == DataType.INTEGER)
                {
                    var valDer = this.right.Execute(ambit);
                    relational_Str += valDer.Texto_anterior;

                    if (valDer.getDataType == DataType.REAL || valDer.getDataType == DataType.INTEGER)
                    {
                        if (this.TrueLabel == "")
                        {
                            this.TrueLabel = generator.newLabel();
                        }
                        if (this.FalseLabel == "")
                        {
                            this.FalseLabel = generator.newLabel();
                        }
                        ambit.free_temp(valIz.getValue());
                        ambit.free_temp(valDer.getValue());
                        relational_Str += generator.add_If(valIz.getValue(), valDer.getValue(), this.type, this.TrueLabel, cant_tabs);
                        relational_Str += generator.add_Goto(this.FalseLabel, cant_tabs);
                        relational_Str += generator.save_comment("Termina " + op, cant_tabs, true);
                        result          = new Returned("", DataType.BOOLEAN, false, this.TrueLabel, this.FalseLabel, relational_Str, "", 0, 0);
                    }
                    else
                    {
                        set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, row, column);
                        return(result);
                    }
                }
                else
                {
                    set_error("Operador '" + this.type + "' NO puede ser aplicado al tipo " + valIz.getDataType, row, column);
                    return(result);
                }

                break;

            default:
                return(result);
            }

            return(result);
        }
        public override Returned Execute(Ambit ambit)
        {
            var varIz  = new Returned();
            var valDer = new Returned();

            var arithmetic_string = "";
            var texto_original    = "";

            if ((this.left is CallFunction) && !(this.right is CallFunction))
            {
                varIz             = this.left.Execute(ambit);
                valDer            = this.right.Execute(ambit);
                arithmetic_string = varIz.Texto_anterior + valDer.Texto_anterior;
                texto_original    = varIz.Valor_original + type + valDer.Valor_original;
            }
            else if (!(this.left is CallFunction) && (this.right is CallFunction))
            {
                valDer            = this.right.Execute(ambit);
                varIz             = this.left.Execute(ambit);
                arithmetic_string = valDer.Texto_anterior + varIz.Texto_anterior;
                texto_original    = varIz.Valor_original + type + valDer.Valor_original;
            }
            else
            {
                varIz             = this.left.Execute(ambit);
                valDer            = this.right.Execute(ambit);
                arithmetic_string = varIz.Texto_anterior + valDer.Texto_anterior;
                texto_original    = varIz.Valor_original + type + valDer.Valor_original;
            }


            var generator = C3DController.Instance;


            if (varIz.getDataType == DataType.INTEGER || varIz.getDataType == DataType.REAL)
            {
                if (valDer.getDataType == DataType.INTEGER || valDer.getDataType == DataType.REAL)
                {
                    var temp = generator.newTemporal();
                    arithmetic_string += generator.addExpression(temp, varIz.getValue(), valDer.getValue(), type, cant_tabs);

                    if (valDer.getDataType == DataType.REAL || varIz.getDataType == DataType.REAL)
                    {
                        return(new Returned(temp, DataType.REAL, true, "", "", arithmetic_string, texto_original, 0, 0));
                    }
                    return(new Returned(temp, DataType.INTEGER, true, "", "", arithmetic_string, texto_original, 0, 0));
                }
                set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + varIz.getDataType + " con " + valDer.getDataType, row, column);
                return(new Returned());
            }
            else if (varIz.getDataType == DataType.STRING && valDer.getDataType == DataType.STRING)
            {
                arithmetic_string += generator.addExpression("T9", varIz.getValue(), "", "", cant_tabs);
                arithmetic_string += generator.addExpression("T10", valDer.getValue(), "", "", cant_tabs);
                arithmetic_string += generator.save_code("native_concat_str();", cant_tabs);
                return(new Returned("T12", DataType.STRING, true, "", "", arithmetic_string, texto_original, 0, 0));
            }


            set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + varIz.getDataType + " con " + valDer.getDataType, row, column);
            return(new Returned());
        }
        public override Returned Execute(Ambit ambit)
        {
            {
                var funcion_llamada = ambit.getFuncion(this.id);
                if (funcion_llamada == null)
                {
                    set_error("La funcion '" + this.id + "' no esta definido", row, column);
                    return(new Returned());
                }

                if (funcion_llamada.Parametos.Count != parametros.Count)
                {
                    set_error("La funcion '" + this.id + "' no recibe la misma cantidad de parametros", row, column);
                    return(new Returned());
                }
                //GUARDAR LOS PARAMETROS EN LA TABLA DE SIMBOLOS

                Ambit function_ambit = new Ambit();


                if (funcion_llamada.IsProcedure)
                {
                    set_error("El procedimiento'" + this.id + "' no puede asignarse como valor de retorno", row, column);
                    return(new Returned());
                }
                else
                {
                    function_ambit = new Ambit(ambit, "Function_" + funcion_llamada.Id, "Function", false);
                }



                //FOREACH PARA GUARDAR LOS PARAMETROS EN EL AMBITO,
                //LOS PARAMETROS QUE RECIBE LA FUNCION CUANDO SE DECLARA SON 'DECLARACIONES'
                //POR TANTO AL HACER EL EXECUTE LA VARIABLE SE GUARDA EN EL AMBITO QUE SE ENVIA
                foreach (var param in funcion_llamada.Parametos)
                {
                    param.Execute(function_ambit);
                }
                //SE ASIGNAN LOS VALORES RECIBIDOS A LOS PARAMETROS DE LA FUNCION
                for (int i = 0; i < parametros.Count; i++)
                {
                    var variable = (Declaration)(funcion_llamada.getParameterAt(i));


                    if (variable.Referencia)
                    {
                        if (parametros[i] is Access)
                        {
                            Access acceso = (Access)parametros[i];
                            funcion_llamada.Parametros_referencia.Add(new SimboloReferencia(variable.Id, acceso.Id));
                        }
                        else if (parametros[i] is Access_array)
                        {
                        }
                    }

                    var result = ((Expression)parametros[i]).Execute(ambit);

                    if (variable.getDataType == result.getDataType)
                    {
                        function_ambit.setVariableFuncion(variable.Id, result.Value, result.getDataType, false, "Parametro");
                    }
                    else
                    {
                        set_error("El tipo " + result.getDataType + " no es asignable con " + variable.getDataType, row, column);
                        return(new Returned());
                    }
                }

                //GUARDA LAS VARIABLES QUE ESTEN DECLARADAS EN LA FUNCION

                if (funcion_llamada.Declaraciones.Count > 0)
                {
                    foreach (var declaracion in funcion_llamada.Declaraciones)
                    {
                        declaracion.Execute(function_ambit);
                    }
                }



                //EJECUCION DEL CODIGO

                var funcion_Elementos = funcion_llamada.Sentences.Execute(function_ambit);

                //si viene null significa que viene error
                if (funcion_Elementos == null)
                {
                    return(new Returned());
                }

                else
                {
                    if (funcion_llamada.IsProcedure)
                    {
                        if (funcion_Elementos is Instruction)
                        {
                            var inst = (Instruction)funcion_Elementos;
                            if (inst.Name.Equals("Exit"))
                            {
                                Exit ex = (Exit)funcion_Elementos;
                                set_error("Los procediminetos no pueden retornar ningun valor", ex.Row, ex.Column);
                                return(new Returned());
                            }
                        }
                        if (funcion_Elementos is Break)
                        {
                            var r = (Break)funcion_Elementos;
                            set_error("La sentencia Break solo puede aparece en ciclos o en la sentencia CASE", r.Row, r.Column);
                        }
                        else if (funcion_Elementos is Continue)
                        {
                            var r = (Continue)funcion_Elementos;
                            set_error("La sentencia Continue solo puede aparece en ciclos", r.Row, r.Column);
                        }
                    }
                    else
                    {
                        if (funcion_Elementos is Instruction)
                        {
                            var inst = (Instruction)funcion_Elementos;
                            if (inst.Name.Equals("Exit"))
                            {
                                var response = ((Exit)funcion_Elementos);

                                if (response.Return_func_return)
                                {
                                    GraphController.Instance.getAmbitoGraficar(function_ambit, false);
                                    //SINTETIZA LOS PARAMETROS POR REFERENCIA
                                    sintetizar_referencia(function_ambit, funcion_llamada);

                                    switch (funcion_llamada.Tipe)
                                    {
                                    case DataType.INTEGER:
                                        return(new Returned(int.Parse(funcion_llamada.Retorno), funcion_llamada.Tipe));

                                    case DataType.STRING:
                                        return(new Returned((funcion_llamada.Retorno), funcion_llamada.Tipe));

                                    case DataType.BOOLEAN:
                                        return(new Returned(bool.Parse(funcion_llamada.Retorno), funcion_llamada.Tipe));

                                    case DataType.REAL:
                                        return(new Returned(double.Parse(funcion_llamada.Retorno), funcion_llamada.Tipe));
                                    }
                                }
                                else
                                {
                                    var ext    = (Exit)funcion_Elementos;
                                    var result = (ext).Value.Execute(function_ambit);
                                    //HAY ERROR
                                    if (result.getDataType == DataType.ERROR || result == null)
                                    {
                                        return(new Returned());
                                    }


                                    //VERIFICA QUE EL TIPO DE RETORNO SEA VALIDO
                                    if (result.getDataType == funcion_llamada.Tipe)
                                    {
                                        //SINTETIZA LOS PARAMETROS POR REFERENCIA
                                        sintetizar_referencia(function_ambit, funcion_llamada);
                                        GraphController.Instance.getAmbitoGraficar(function_ambit, false);

                                        switch (funcion_llamada.Tipe)
                                        {
                                        case DataType.INTEGER:
                                            return(new Returned((int)result.Value, result.getDataType));

                                        case DataType.STRING:
                                            return(new Returned((string)result.Value, result.getDataType));

                                        case DataType.BOOLEAN:
                                            return(new Returned((bool)result.Value, result.getDataType));

                                        case DataType.REAL:
                                            return(new Returned((double)result.Value, result.getDataType));
                                        }
                                    }
                                    else
                                    {
                                        set_error("Tipos incompatibles, la funcion '" + funcion_llamada.Id + "' retorna " + funcion_llamada.Tipe + " en lugar de" + result.getDataType, ext.Row, ext.Column);
                                        return(new Returned());
                                    }
                                }
                            }
                        }
                        else if (funcion_Elementos is Returned)
                        {
                            //SINTETIZA LOS PARAMETROS POR REFERENCIA
                            sintetizar_referencia(function_ambit, funcion_llamada);
                            GraphController.Instance.getAmbitoGraficar(function_ambit, false);
                            return((Returned)funcion_Elementos);
                        }
                        else
                        {
                            //SINTETIZA LOS PARAMETROS POR REFERENCIA
                            sintetizar_referencia(function_ambit, funcion_llamada);
                            GraphController.Instance.getAmbitoGraficar(function_ambit, false);


                            switch (funcion_llamada.Tipe)
                            {
                            case DataType.INTEGER:
                                return(new Returned(int.Parse(funcion_llamada.Retorno), funcion_llamada.Tipe));

                            case DataType.STRING:
                                return(new Returned((funcion_llamada.Retorno), funcion_llamada.Tipe));

                            case DataType.BOOLEAN:
                                return(new Returned(bool.Parse(funcion_llamada.Retorno), funcion_llamada.Tipe));

                            case DataType.REAL:
                                return(new Returned(double.Parse(funcion_llamada.Retorno), funcion_llamada.Tipe));
                            }
                        }
                    }
                }
                return(new Returned());
            }
        }
예제 #24
0
        public override object Execute(Ambit ambit)
        {
            //INSTANCIA GENERADOR C3D
            var generator   = C3DController.Instance;
            var label_print = "";
            var write_Str   = "";

            write_Str += generator.save_comment("Inicia Print PRINTTEMP", cant_tabs, false);

            //FOREACH DE LAS EXPRESIONES A HACER PRINT
            foreach (Expresion el in value)
            {
                if (el is Literal)
                {
                    if (((Literal)el).Type == 3)
                    {
                        var res = ((Literal)el).Value.ToString();
                        write_Str += generator.print_boolean(cant_tabs, res);
                        continue;
                    }
                    if (((Literal)el).Type == 2)
                    {
                        var res = ((Literal)el).Value.ToString();
                        if (res.ToLower().Equals("true") || res.ToLower().Equals("false"))
                        {
                            write_Str += generator.print_boolean(cant_tabs, res);
                            continue;
                        }
                    }
                }
                if (el is Access)
                {
                    label_print = ":" + ((Access)el).Id;
                }

                var element = el.Execute(ambit);
                if (element.IsTemporal)
                {
                    ambit.free_temp(element.getValue());
                }

                write_Str += element.Texto_anterior;

                if (element.getDataType == DataType.ERROR)
                {
                    return(null);
                }
                switch (element.getDataType)
                {
                case DataType.INTEGER:
                    write_Str += generator.generate_print("i", element.getValue(), "(int)", cant_tabs);
                    break;

                case DataType.STRING:

                    generator.Native_str = true;

                    var temp_stack = element.getValue();
                    write_Str += generator.addExpression("T1", temp_stack, "", "", cant_tabs);

                    write_Str += generator.save_code("native_print_str();", cant_tabs);

                    /*var label_temp = generator.newLabel();
                     * generator.addLabel(label_temp, cant_tabs);
                     * var temp_heap = generator.newTemporal();
                     *
                     * generator.get_Heap(temp_heap, temp_stack, cant_tabs);
                     *
                     * var true_label = generator.newLabel();
                     *
                     * generator.add_If(temp_heap, "-1", "==", true_label, cant_tabs);
                     *
                     * generator.generate_print("c", temp_heap, "(int)", cant_tabs);
                     *
                     * generator.addExpression(temp_stack, temp_stack, "1", "+", cant_tabs);
                     *
                     * generator.add_Goto(label_temp, cant_tabs);
                     * generator.addLabel(true_label, cant_tabs);*/

                    break;

                case DataType.BOOLEAN:

                    write_Str += generator.addLabel(element.TrueLabel, cant_tabs);
                    write_Str += generator.addLabel(element.FalseLabel, cant_tabs);
                    write_Str += generator.print_boolean(cant_tabs, element.Valor_original);
                    break;

                case DataType.REAL:
                    write_Str += generator.generate_print("f", element.getValue(), "(float)", cant_tabs);
                    break;

                default:
                    break;
                }
            }
            if (this.isln)
            {
                write_Str += generator.generate_print("c", "10", "(int)", cant_tabs);
            }
            write_Str += generator.save_comment("Fin Print PRINTTEMP", cant_tabs, true);
            write_Str  = generator.replace_temp(label_print, "PRINTTEMP", write_Str);
            return(write_Str);
        }
예제 #25
0
        public override object Execute(Ambit ambit)
        {
            try
            {
                var val = this.value.Execute(ambit);

                Identifier variableAmbit = ambit.getVariable(id);
                var        generator     = C3DController.Instance;



                /**
                 * VALIDAR EXISTENCIA
                 */
                if (!variableAmbit.IsNull)
                {
                    /**
                     * VERIFICA QUE NO SEA CONSTABTE
                     */
                    if (variableAmbit.Esconstante)
                    {
                        setError("No se puede cambiar el valor a una constante", row, column);
                        return(null);
                    }
                    else
                    {
                        assignation_string += val.Texto_anterior;

                        if (val == null || val.getDataType == DataType.ERROR)
                        {
                            return(null);
                        }

                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (variableAmbit.DataType == val.getDataType)
                        {
                            if (val.IsTemporal)
                            {
                                ambit.free_temp(val.Value);
                            }

                            if (variableAmbit.IsGlobal)
                            {
                                if (variableAmbit.DataType == DataType.BOOLEAN)
                                {
                                    var templabel = generator.newLabel();
                                    assignation_string += generator.addLabel(val.TrueLabel, tabs);
                                    assignation_string += generator.set_stack(variableAmbit.Position.ToString(), "1", tabs);
                                    assignation_string += generator.add_Goto(templabel, tabs + 1);
                                    assignation_string += generator.addLabel(val.FalseLabel, tabs);
                                    assignation_string += generator.set_stack(variableAmbit.Position.ToString(), "0", tabs);
                                    assignation_string += generator.addLabel(templabel, tabs);
                                }
                                else
                                {
                                    var tempAux = variableAmbit.Position_global.ToString();
                                    if (variableAmbit.IsReference)
                                    {
                                        var temp = generator.newTemporal();
                                        assignation_string += generator.get_stack(temp, variableAmbit.Position_global.ToString(), tabs);
                                        generator.freeTemp(temp);
                                        tempAux = temp;
                                    }


                                    assignation_string += generator.set_stack(tempAux, val.getValue(), tabs);
                                }
                            }
                            else
                            {
                                var temp = generator.newTemporal();
                                ambit.set_temp(temp);
                                assignation_string += generator.addExpression(temp, "SP", variableAmbit.Position.ToString(), "+", tabs);


                                if (variableAmbit.IsReference)
                                {
                                    var newTemp = generator.newTemporal();
                                    ambit.set_temp(newTemp);
                                    ambit.free_temp(temp);
                                    generator.freeTemp(temp);
                                    assignation_string += generator.get_stack(newTemp, temp, tabs);
                                    temp = newTemp;
                                }



                                if (variableAmbit.DataType == DataType.BOOLEAN)
                                {
                                    generator.freeTemp(temp);
                                    var templabel = generator.newLabel();
                                    assignation_string += generator.addLabel(val.TrueLabel, tabs);
                                    assignation_string += generator.set_stack(temp, "1", tabs);
                                    assignation_string += generator.add_Goto(templabel, tabs + 1);
                                    assignation_string += generator.addLabel(val.FalseLabel, tabs);
                                    assignation_string += generator.set_stack(temp, "0", tabs);
                                    assignation_string += generator.addLabel(templabel, tabs);
                                }
                                else
                                {
                                    generator.freeTemp(temp);
                                    assignation_string += generator.set_stack(temp, val.getValue(), tabs);
                                }
                            }


                            return(assignation_string);
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + variableAmbit.DataType, row, column);
                            return(null);
                        }
                    }
                }
                else
                {
                    Function function = ambit.getFuncion(id);
                    if (function != null)
                    {
                        if (function.IsProcedure)
                        {
                            setError("No puede asignarse ningun valor al procedimiento '" + id + "' ", row, column);
                            return(null);
                        }

                        /**
                         * VALIDAR VALOR: VERIFICA SI EL TIPO DE LA VARIABLE ES IGUAL AL DEL VALOR A ASIGNAR
                         */
                        if (function.Tipe == val.getDataType)
                        {
                            function.Retorno = val.getValue();
                            ambit.setFunction(Id, function);

                            assignation_string += val.Texto_anterior;
                            assignation_string += generator.set_stack("T13", function.Retorno, tabs);
                        }
                        else
                        {
                            setError("El tipo " + val.getDataType + " no es asignable con " + function.Tipo, row, column);
                            return(null);
                        }
                    }
                    else
                    {
                        setError("La variable '" + id + "' no esta declara", row, column);
                        return(null);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                ConsolaController.Instance.Add("Recuperado de error, Row:" + row + " Col: " + column);
                return(null);
            }
            return(assignation_string);
        }
예제 #26
0
        public override object Execute(Ambit ambit)
        {
            var forAmbit = new Ambit(ambit, ambit.Ambit_name, "For", false, ambit.IsFunction);



            //SE HACE LA ASIGNACION INICIAL
            Assignation assignation = new Assignation(initId, inicializacion, row, column, cant_tabs);

            Identifier identifier = ambit.getVariable(initId);

            var for_str = "";

            //VERIFICA QUE EL IDENTIFICADOR EXISTA
            if (!identifier.IsNull)
            {
                //VERIFICA QUE LA VARIABLE NO HAYA SIDO ASIGNADA EN LA DECLARACION
                if (!identifier.IsAssiged)
                {
                    var generator = C3D.C3DController.Instance;

                    var simb2 = (direccion.ToLower().Equals("to")) ? "+" : "-";
                    var simb  = (direccion.ToLower().Equals("to")) ? ">" : "<";


                    for_str += generator.save_comment("Inicia For", cant_tabs, false);

                    //ETIQUETA DE RECURRENCIA
                    //var recurrence_label = generator.newLabel();


                    //SE ASIGNA EL NUEVO VALOR A LA VARIABLE
                    for_str += assignation.Execute(forAmbit);


                    //IMPRIMRE TAG RECURRENCIA

                    //for_str += generator.save_comment(recurrence_label+ ": //Etiqueta Recurrencia", cant_tabs, false);


                    //SE CREA LA CONDICION
                    //Relational cond_temp = new Relational((new Access(initId, row, column, cant_tabs)), actualizacion, simb, row, column, cant_tabs);

                    var trueLabel = generator.newLabel();

                    var continueLabel = generator.newLabel();

                    var falseLabel = generator.newLabel();

                    var actual = actualizacion.Execute(forAmbit);

                    for_str += actual.Texto_anterior;
                    for_str += generator.addLabel(trueLabel, cant_tabs);

                    var acceso = (new Access(initId, row, column, cant_tabs)).Execute(forAmbit);
                    for_str += acceso.Texto_anterior;

                    for_str += generator.add_If(acceso.Value.ToString(), actual.Value, simb, falseLabel, cant_tabs);

                    forAmbit.Continue = continueLabel;
                    forAmbit.Break    = falseLabel;

                    //SE IMPRIMEN LAS INSTRUCCIONES

                    foreach (Instruction item in sentences)
                    {
                        var element = item.Execute(forAmbit);
                        if (element == null)
                        {
                            return(null);
                        }
                        for_str += element.ToString();
                    }



                    for_str += generator.addLabel(continueLabel, cant_tabs);

                    for_str += generator.addExpression(acceso.Value.ToString(),
                                                       acceso.Value.ToString(), "1", simb2, cant_tabs);


                    Assignation assignation1 = new Assignation(initId,
                                                               new Literal(acceso.Value.ToString(), 1, row, column, cant_tabs), row, column, cant_tabs);


                    for_str += (assignation1.Execute(forAmbit));


                    //goto a etiqueta verdadera
                    for_str += generator.add_Goto(trueLabel, cant_tabs);

                    //etiqueta falsa
                    for_str += generator.addLabel(falseLabel, cant_tabs);
                }
                else
                {
                    set_error("Variable de contador ilegal: La variable '" + initId + "' no debe estar inicializada al momento de su declaracion", row, column);
                    return(null);
                }
            }
            else
            {
                set_error("La variable '" + initId + "' no esta declarada.", row, column);
                return(null);
            }



            return(for_str);
        }
        public void getAmbitoGraficar(Ambit ambit, bool isgeneral)
        {
            if (ambitos.Count <= 20)
            {
                var ambito_name = ambit.Ambit_name.Replace("General_", "");

                var enlace = "";

                var texto =
                    ambito_name + "[label=<\n" +
                    "<table border='0' cellborder='1' cellspacing='0'>\n" +
                    "<tr>\n" +
                    "<td>" + ambito_name + "</td>" +
                    "</tr>\n" +
                    "<tr>\n" +
                    "<td cellpadding='4'>\n" +
                    "<table color='orange' cellspacing='0'>\n" +
                    "<tr>\n" +
                    "<td width='100'><i>Nombre</i></td>\n" +
                    "<td width='100'><i>Tipo</i></td>\n" +
                    "<td width='100'><i>Ambito</i></td>\n" +
                    "<td width='100'><i>Valor</i></td>\n" +
                    "<td width='100'><i>Tipo objeto</i></td>\n" +
                    "</tr>\n";


                if (ambit.anterior != null)
                {
                    var ambit_temp = ambit.anterior.Ambit_name.Replace("General_", "");
                    enlace = ambit_temp + "->" + ambito_name + ";\n";
                }

                var res_graphi = "";
                while (ambit != null)
                {
                    if (ambit.Variables.Count > 0)
                    {
                        foreach (var item in ambit.Variables)
                        {
                            Identifier id = (Identifier)item.Value;
                            ambito_name = ambit.Ambit_name.Replace("General_", "");
                            res_graphi  = "\n<tr>\n\t<td height='25'>" + id.Id + "</td>\n\t<td height='25'>" + id.DataType + "</td>\n\t<td height='25'>" + ambito_name + "</td>\n\t<td height='25'>" + id.Value.ToString() + "</td>\n\t<td height='25'>" + id.Tipo_dato + "</td>\n</tr>" + res_graphi;
                        }
                    }


                    if (isgeneral)
                    {
                        if (ambit.Functions.Count > 0)
                        {
                            var type   = "void";
                            var isfunc = "Procedure";

                            foreach (var item in ambit.Functions)
                            {
                                type   = "void";
                                isfunc = "Procedure";

                                Function func = (Function)item.Value;
                                if (!func.IsProcedure)
                                {
                                    isfunc = "Function";
                                    type   = func.Tipe.ToString();
                                }
                                res_graphi = "<tr>\n<td height='25'>" + func.Id + "</td>\n<td height='25'>" + type + "</td>\n<td height='25'>" + ambit.Ambit_name + "</td>\n<td height='25'>" + func.Retorno.ToString() + "</td>\n<td height='25'>" + isfunc + "</td>\n</tr>" + res_graphi;
                            }
                        }
                    }



                    var temp = ambit.anterior;
                    ambit = temp;
                }


                texto += res_graphi
                         + "</table>\n</td>\n</tr>\n </table>>];\n";

                ambitos.Add(new Simbolo(ambito_name, texto, enlace));
            }
        }
        public override Returned Execute(Ambit ambit)
        {
            var valIz  = this.left.Execute(ambit);
            var valDer = this.right.Execute(ambit);


            TablaTipo tablaTipo = new TablaTipo();

            var res = tablaTipo.getTipoRel(valIz.getDataType, valDer.getDataType);

            if (res == DataType.ERROR)
            {
                set_error("Operador '" + this.type + "' NO puede ser aplicado a los tipos " + valIz.getDataType + " con " + valDer.getDataType, 0, 0);
                return(new Returned());
            }


            var result = new Returned();
            var op     = GetType(this.type);

            switch (op)
            {
            case OpRelational.EQUALS:

                var equals = (bool)(valIz.Value.ToString() == valDer.Value.ToString());
                result = new Returned(equals, DataType.BOOLEAN);
                break;

            case OpRelational.DISCTINCT:
                var distict = (bool)(valIz.Value.ToString() != valDer.Value.ToString());
                result = new Returned(distict, DataType.BOOLEAN);
                break;

            case OpRelational.LESS:
                var less = (bool)(double.Parse(valIz.Value.ToString()) < double.Parse(valDer.Value.ToString()));
                result = new Returned(less, DataType.BOOLEAN);

                break;

            case OpRelational.LESS_EQUALS:
                var lessE = (bool)(double.Parse(valIz.Value.ToString()) <= double.Parse(valDer.Value.ToString()));
                result = new Returned(lessE, DataType.BOOLEAN);

                break;

            case OpRelational.HIGHER:
                var higher = (bool)(double.Parse(valIz.Value.ToString()) > double.Parse(valDer.Value.ToString()));
                result = new Returned(higher, DataType.BOOLEAN);
                break;

            case OpRelational.HIGHER_EQUALS:
                var higherE = (bool)(double.Parse(valIz.Value.ToString()) >= double.Parse(valDer.Value.ToString()));
                result = new Returned(higherE, DataType.BOOLEAN);

                break;

            default:
                break;
            }

            return(result);
        }
예제 #29
0
 public override object Execute(Ambit ambit)
 {
     ambit.saveFuncion(this.id, this);
     return(0);
 }
예제 #30
0
        public override object Execute(Ambit ambit)
        {
            var repeat_String = "";

            //INSTANCIA DEL GENERADOR C3D
            var generator = C3D.C3DController.Instance;

            //AMBITO DEL REPEAT
            var repeatAmbit = new Ambit(ambit, ambit.Ambit_name + "_Repeat", "Repeat", false, ambit.IsFunction);

            repeat_String += generator.save_comment("Inicia Repeat", cant_tabs, false);

            //SETEO Continue y break por defecto
            repeatAmbit.Break    = "LBREAK";
            repeatAmbit.Continue = "LCONTINUE";



            condition.TrueLabel  = generator.newLabel();
            condition.FalseLabel = generator.newLabel();

            //IMPRIMIR ETIQUETA RECURRENCIA
            repeat_String += generator.addLabel("LCONTINUE", cant_tabs);


            //INSTRUCCIONES
            var result = sentences.Execute(repeatAmbit);

            if (result == null)
            {
                return(null);
            }

            repeat_String += result.ToString();


            //CONDICION
            var condicion = condition.Execute(repeatAmbit);

            repeat_String += condicion.Texto_anterior;

            repeatAmbit.Break    = condicion.TrueLabel;
            repeatAmbit.Continue = condicion.FalseLabel;

            repeat_String = generator.replace_temp(condicion.TrueLabel, "LBREAK", repeat_String);
            repeat_String = generator.replace_temp(repeatAmbit.Continue, "LCONTINUE", repeat_String);
            //VERIFICA QUE SEA BOOL
            if (condicion.getDataType != DataType.BOOLEAN)
            {
                set_error("La condicion del repeat no es booleana", row, column);
                return(null);
            }

            //IMPRIMIR ETIQUETA VERDADERA
            repeat_String += generator.addLabel(condicion.TrueLabel, cant_tabs);
            repeat_String += generator.save_comment("Fin Repeat", cant_tabs, true);



            return(repeat_String);
        }