public virtual IFunctionCil Visit(MethodContext parserRule)
        {
            IFunctionCil function;
            var          contextCil = new ContextCil();

            //El unico metodo que no pertenece a una clase es entry
            if (parserRule.Parent == null)
            {
                function = CilAst.GetFunctionCilsByName($"{parserRule.idText}");
            }
            else
            {
                // El nombre metodo en el tipo tiene siempre esta estructura (Type_CoolName)
                function = CilAst.GetFunctionCilsByName($"{(parserRule.Parent as ClassContext).type.Text}_{parserRule.idText}");
                // Como toda fucion pertenece a una clase se le agrega self como una parametro
                var self = new ArgCil("self");
                function.ArgCils.Add(self);
                contextCil.Define("self");
                foreach (var formal in parserRule._formals)
                {
                    Visit(formal, function, contextCil);
                }
            }
            var result = Visit(parserRule.exprBody, function, contextCil);

            function.ThreeDirInses.Add(new ReturnCil(result));
            return(function);
        }
        public void Visit()
        {
            IFunctionCil init  = typeCil.Init.Function;
            var          value = new LocalCil("self");

            init.LocalCils.Add(value);
            var typeCilNew = CilAst.GetTypeCilByName(typeCil.Name, typeCil);

            init.ThreeDirInses.Add(new Allocate(value, typeCilNew));
            var typeCool   = GlobalContext.GetType(typeCil.Name);
            var contextCil = new ContextCil();

            contextCil.Define("self");
            foreach (var typeTemp in typeCool.Hierachty)
            {
                foreach (var attributeTemp in typeTemp.Attributes)
                {
                    //Inicializamos los atributos
                    if (attributeTemp.initializacion != null)
                    {
                        var valueAttribute = Visit(attributeTemp.initializacion, init, contextCil);
                        //No siempre los tipos de Cil estan para eso eso habria que hacer 2 pasadas al AST
                        init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), valueAttribute));
                    }
                    else
                    {
                        if (typeTemp == GlobalContext.Int || typeTemp == GlobalContext.Bool)
                        {
                            init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), new ValuelCil("0")));
                        }
                        else if (typeTemp == GlobalContext.String)
                        {
                            var valueS = new LocalCil($"_value{init.LocalCils.Count}");
                            init.LocalCils.Add(valueS);

                            var stringCool    = "";
                            var varDataString = new VarCil($"s{CilAst.dataStringCils.Count}");
                            CilAst.dataStringCils.Add(new DataStringCil(varDataString, new StringCil(stringCool)));
                            init.ThreeDirInses.Add(new LoadCil(valueS, varDataString));
                            init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), valueS));
                        }
                        else if (attributeTemp.Type == GlobalContext.String)
                        {
                            init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), CreateABasicType(init, CilAst.String)));
                        }
                        else if (attributeTemp.Type == GlobalContext.Int)
                        {
                            init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), CreateABasicType(init, CilAst.Int)));
                        }
                        else if (attributeTemp.Type == GlobalContext.Bool)
                        {
                            init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), CreateABasicType(init, CilAst.Bool)));
                        }
                        else
                        {
                            init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), Visit_void(init)));
                        }
                    }
                }
            }
            init.ThreeDirInses.Add(new ReturnCil(value));
        }