Пример #1
0
        public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores)
        {
            if (!isDeclaracion)
            {
                Debugger(e, "If");
            }

            Result result = new Result();

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

                    Result rsCondicion = Condicion.GetC3D(e, funcion, ciclo, isObjeto, errores);

                    if (Condicion is Literal)
                    {
                        rsCondicion.EtiquetaV = NuevaEtiqueta();
                        rsCondicion.EtiquetaF = NuevaEtiqueta();

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

                    if (Condicion is Relacional || Condicion is Literal)
                    {
                        string copy = rsCondicion.EtiquetaF;
                        rsCondicion.EtiquetaF = rsCondicion.EtiquetaV;
                        rsCondicion.EtiquetaV = copy;
                    }
                    Ent local = new Ent(e.Ambito + "_if", e);
                    local.EtiquetaCiclo       = e.EtiquetaCiclo;
                    local.EtiquetaSalida      = e.EtiquetaSalida;
                    local.EtiquetaSalidaCiclo = e.EtiquetaSalidaCiclo;

                    local.Size = e.Size;
                    local.Pos  = e.Pos;

                    result.Codigo += rsCondicion.Codigo;
                    result.Codigo += rsCondicion.EtiquetaV;
                    result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                    result.Codigo += "goto " + Salida + ";\n";
                    result.Codigo += rsCondicion.EtiquetaF;

                    e.Pos = local.Pos;
                }
                else
                {
                    Ent local = new Ent(e.Ambito + "_if", e);
                    local.EtiquetaCiclo       = e.EtiquetaCiclo;
                    local.EtiquetaSalida      = e.EtiquetaSalida;
                    local.EtiquetaSalidaCiclo = e.EtiquetaSalidaCiclo;
                    local.Size = e.Size;
                    local.Pos  = e.Pos;

                    result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                    result.Codigo += "goto " + Salida + ";\n";

                    e.Pos = local.Pos;
                }
            }
            else
            {
                Ent local = new Ent(e.Ambito + "_else", e);
                local.EtiquetaCiclo       = e.EtiquetaCiclo;
                local.EtiquetaSalida      = e.EtiquetaSalida;
                local.EtiquetaSalidaCiclo = e.EtiquetaSalidaCiclo;
                local.Size = e.Size;
                local.Pos  = e.Pos;

                result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                result.Codigo += "goto " + Salida + ";\n";

                e.Pos = local.Pos;
            }

            return(result);
        }
Пример #2
0
        public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores)
        {
            if (!isDeclaracion)
            {
                Debugger(e, "For");
            }

            Result result = new Result();

            if (!isDeclaracion)
            {
                if (Objetivo.Count() > 0)
                {
                    Expresion objetivo   = Objetivo.ElementAt(0); /*Solo funciona con uno*/
                    Result    rsObjetivo = null;

                    Identificador idObjetivo   = null;
                    Referencia    refObjetivo  = null;
                    AccesoLista   listObjetivo = null;

                    if (objetivo is Identificador)
                    {
                        idObjetivo               = (Identificador)objetivo;
                        idObjetivo.Acceso        = false;
                        idObjetivo.IsDeclaracion = isDeclaracion;

                        rsObjetivo = idObjetivo.GetC3D(e, funcion, ciclo, isObjeto, errores);
                    }

                    if (objetivo is Referencia)
                    {
                        refObjetivo              = (Referencia)objetivo;
                        refObjetivo.Acceso       = false;
                        refObjetivo.ObtenerValor = true;

                        rsObjetivo = refObjetivo.GetC3D(e, funcion, ciclo, isObjeto, errores);
                    }

                    if (objetivo is AccesoLista)
                    {
                        listObjetivo        = (AccesoLista)objetivo;
                        listObjetivo.Acceso = false;

                        rsObjetivo = listObjetivo.GetC3D(e, funcion, ciclo, isObjeto, errores);
                    }

                    if (rsObjetivo != null)
                    {
                        if (rsObjetivo.Valor != null)
                        {
                            result.Codigo = rsObjetivo.Codigo;

                            Result rsValor = Valor.GetC3D(e, funcion, ciclo, isObjeto, errores);

                            if (rsValor != null)
                            {
                                if (Valor.GetTipo().IsList())
                                {
                                    if (rsValor != null)
                                    {
                                        result.Codigo += rsValor.Codigo;

                                        string ptr = NuevoTemporal();
                                        result.Codigo += ptr + " = " + rsValor.Valor + ";\n";

                                        result.EtiquetaF = NuevaEtiqueta();
                                        result.EtiquetaV = NuevaEtiqueta();
                                        string etqCiclo  = NuevaEtiqueta();
                                        string etqSalida = "";

                                        if (BloqueElse != null)
                                        {
                                            etqSalida = NuevaEtiqueta();
                                        }

                                        result.Codigo += etqCiclo + ":\n";

                                        result.Codigo += "ifFalse (" + ptr + " >= 0 ) goto " + result.EtiquetaF + ";\n";
                                        result.Codigo += "goto " + result.EtiquetaV + ";\n";
                                        result.Codigo += result.EtiquetaV + ":\n";
                                        result.Codigo += rsObjetivo.Valor + " = heap[" + ptr + "];\n";
                                        result.Codigo += ptr + " = " + ptr + " + 1;\n";
                                        result.Codigo += ptr + " = heap[" + ptr + "];\n";

                                        Ent local = new Ent(e.Ambito + "_for", e);
                                        local.EtiquetaCiclo = etqCiclo;

                                        if (BloqueElse != null)
                                        {
                                            local.EtiquetaSalidaCiclo = etqSalida;
                                        }
                                        else
                                        {
                                            local.EtiquetaSalidaCiclo = result.EtiquetaF;
                                        }

                                        result.Codigo += Bloque.GetC3D(local, funcion, true, isDeclaracion, isObjeto, errores).Codigo; //arreglar

                                        result.Codigo += "goto " + etqCiclo + ";\n";
                                        result.Codigo += result.EtiquetaF + ":\n";

                                        if (BloqueElse != null)
                                        {
                                            Ent local2 = new Ent(e.Ambito + "_for", e);
                                            result.Codigo += BloqueElse.GetC3D(local2, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                                            result.Codigo += etqSalida + ":\n";
                                        }
                                    }
                                    else
                                    {
                                        errores.AddLast(new Error("Semántico", "Error obteniendo el valor a iterar.", Linea, Columna));
                                    }
                                }/*buscar otras*/
                            }
                            else
                            {
                                errores.AddLast(new Error("Semántico", "Error obteniendo el valor a iterar.", Linea, Columna));
                            }
                        }
                        else
                        {
                            errores.AddLast(new Error("Semántico", "Error obteniendo el target.", Linea, Columna));
                        }
                    }
                    else
                    {
                        errores.AddLast(new Error("Semántico", "Error obteniendo el target.", Linea, Columna));
                    }
                }
            }
            else
            {
                if (BloqueElse == null)
                {
                    Ent local = new Ent(e.Ambito + "_for", e);
                    local.Pos      = e.Pos;
                    result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                    e.Pos          = local.Pos;
                }
                else
                {
                    Ent local = new Ent(e.Ambito + "_for", e);
                    local.Pos      = e.Pos;
                    result.Codigo += Bloque.GetC3D(local, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                    e.Pos          = local.Pos;
                    Ent local2 = new Ent(e.Ambito + "_else", e);
                    local2.Pos     = e.Pos;
                    result.Codigo += BloqueElse.GetC3D(local2, funcion, ciclo, isDeclaracion, isObjeto, errores).Codigo;
                    e.Pos          = local.Pos;
                }
            }

            return(result);
        }