public static List <string> SaveToRegister(IHolderCil x, IFunctionCil function, string dest)
        {
            List <string> result = new List <string>();

            if (function.LocalCils.Contains(x)) //si y es una variable local
            {
                var index = function.localsDict[x.Name];
                result.Add($"lw ${dest}, {index}($sp)");
            }
            else if (function.ArgCils.Contains(x))
            {   //si y es un parametro
                //var index = function.ArgCils.ToList().FindIndex(i => i.Name.Equals(x.Name));
                //result.Add($"move ${dest}, $a{index}");
                var index = function.argsDict[x.Name];
                result.Add($"lw ${dest}, {index}($sp)");
            }
            else if (x == null)
            {
                result.Add($"li ${dest}, 0");
            }
            else //si y es un valor
            {
                result.Add($"li ${dest}, " + x.Name);
            }
            return(result);
        }
        public static List <string> AcomodarVariables(IHolderCil y, IFunctionCil function)
        {
            List <string> result = new List <string>();

            result.AddRange(SaveToRegister(y, function, "t1"));
            return(result);
        }
        public IVarCil GetValue(IHolderCil obj, IFunctionCil cilTree, ITypeCil typeCil)
        {
            var value = new LocalCil($"_value{cilTree.LocalCils.Count}");

            cilTree.LocalCils.Add(value);
            cilTree.ThreeDirInses.Add(new GetAttrCil(value, obj, typeCil.GetAttributeCilsByCoolName("x")));
            return(value);
        }
        public void Visit_Runtime_Error_whit_Cond(IHolderCil valueCond, IFunctionCil cilTree, string sms)
        {
            var Continue = cilTree.CreateLabel($"Continue_");

            cilTree.ThreeDirInses.Add(new IfGoto(valueCond, Continue));
            var varStr = new LocalCil($"_value{cilTree.LocalCils.Count}");

            cilTree.LocalCils.Add(varStr);
            var varDataString = new VarCil($"s{CilAst.dataStringCils.Count}");

            CilAst.dataStringCils.Add(new DataStringCil(varDataString, new StringCil(sms)));
            cilTree.ThreeDirInses.Add(new LoadCil(varStr, varDataString));
            cilTree.ThreeDirInses.Add(new Out_strCil(varStr));
            cilTree.ThreeDirInses.Add(new Halt());
            cilTree.ThreeDirInses.Add(new Label(Continue));
        }
 public VCallCil(IVarCil x, IHolderCil t, IHolderCil f) : base(x, t, f)
 {
 }
 public ArgExprCil(IHolderCil x)
 {
     X = x;
 }
 public IVarCil SetValue(IVarCil obj, IHolderCil value, IFunctionCil cilTree, ITypeCil typeCil)
 {
     cilTree.ThreeDirInses.Add(new SetAttrCil(obj, typeCil.GetAttributeCilsByCoolName("x"), value));
     return(obj);
 }
 protected UnaryCil(IVarCil x, IHolderCil y) : base(x)
 {
     Y = y;
 }
 public SubStringCil(IVarCil x, IHolderCil y, IHolderCil i, IHolderCil l) : base(x, y, i)
 {
     L = l;
 }
 public Copy(IVarCil x, IHolderCil y) : base(x, y)
 {
 }
 public NegCil(IVarCil x, IHolderCil y) : base(x, y)
 {
 }
 public LenghtCil(IVarCil x, IHolderCil y) : base(x, y)
 {
 }
 public NotEqualCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y, z)
 {
 }
 public Minor_EqualCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y, z)
 {
 }
 public EqualStringCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y, z)
 {
 }
 public DivCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y, z)
 {
 }
 public MultCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y, z)
 {
 }
 public IfGoto(IHolderCil varCil, ILabelCil labelCil) : base(labelCil)
 {
     VarCil = varCil;
 }
 public AssigCil(IVarCil x, IHolderCil y) : base(x, y)
 {
 }
 public ReturnCil(IHolderCil x)
 {
     X = x;
 }
 //public IVarCil Y { get; set; }
 public GetAttrCil(IVarCil x, IHolderCil y, IHolderCil b) : base(x, y, b)
 {
 }
 public ConcatCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y, z)
 {
 }
 public IVarCil CreateABasicTypeWhitVal(IFunctionCil cilTree, ITypeCil typeCil, IHolderCil value)
 {
     return(SetValue(CreateABasicType(cilTree, typeCil), value, cilTree, typeCil));
 }
 public IsNotConformCil(IVarCil x, IHolderCil a, IHolderCil b) : base(x, a, b)
 {
 }
 public TypeOf(IVarCil x, IHolderCil typeCil) : base(x, typeCil)
 {
 }
 public Type_Name(IVarCil x, IHolderCil y) : base(x, y)
 {
 }
 public DecArrayCil(IVarCil x, IHolderCil y) : base(x, y)
 {
 }
 public SetAttrCil(IVarCil x, IHolderCil b, IHolderCil y) : base(x, b, y)
 {
 }
 public BinaryVarCil(IVarCil x, IHolderCil y, IHolderCil z) : base(x, y)
 {
     Z = z;
 }