예제 #1
0
        public bool Visit(AST_ClassDef node)
        {
            bool solve = true;

            if (!All_Types.ContainsKey(node.Id.Id))
            {
                return(false);
            }

            CurrType = All_Types[node.Id.Id];

            CurrContext = CurrContext.CreateChild();

            SemanticType father = All_Types[node.Id.Id].Father;

            while (true)
            {
                var my_atributes = father.GetAllAttr();
                foreach (var attr in my_atributes)
                {
                    //if (attr.Type.Name == "int")
                    //    attr.Type.Name = "Int";
                    //if (attr.Type.Name == "string")
                    //    attr.Type.Name = "String";
                    //if (attr.Type.Name == "bool")
                    //    attr.Type.Name = "Bool";
                    if (!All_Types.ContainsKey(attr.Type.Name))
                    {
                        CurrErrorLoger.LogError(node.row, node.col, "El tipo de la declaracion del atributo no existe");
                        if (!CurrContext.NullFather())
                        {
                            CurrContext = CurrContext.GetParent();
                        }
                        return(false);
                    }
                    CurrContext.SetType(attr.Id, attr.Type);
                }
                father = father.Father;
                if (father == null)
                {
                    break;
                }
            }

            bool visit_result = node.Property_list.Visit(this) &&
                                node.Method_list.Visit(this);

            if (!CurrContext.NullFather())
            {
                CurrContext = CurrContext.GetParent();
            }

            CurrType = null;

            return(visit_result);
        }
예제 #2
0
        public bool Visit(AST_ClassDef node)
        {
            bool solve = true;

            solve &= node.Property_list.Visit(this);

            solve &= node.Method_list.Visit(this);

            return(solve);
        }
예제 #3
0
        public string Visit(AST_ClassDef node)
        {
            SemanticType         t     = semantictypes[node.Id.Id];
            List <CIL_ClassAttr> lattr = new List <CIL_ClassAttr>();

            foreach (var item in t.GetAllAttr())
            {
                lattr.Add(new CIL_ClassAttr(item.Id));
            }
            List <CIL_ClassMethod> lmeth = new List <CIL_ClassMethod>();

            foreach (var item in t.Father.GetAllMethods())
            {
                if (t._find_method(item.Name) == -1)
                {
                    lmeth.Add(new CIL_ClassMethod(item.Name, item.Label()));
                }
            }
            foreach (var item in t.Methods)
            {
                lmeth.Add(new CIL_ClassMethod(item.Name, item.Label()));
            }

            methodcontext.actual_type     = semantictypes[node.Id.Id];
            methodcontext.propertys_class = node.Property_list;
            foreach (var item in node.Method_list.Methods)
            {
                methodcontext.Reset(methodcontext.actual_type.GetMethod(item.Id.Id).Label());
                methodcontext.Staments.Add(new CIL_ExceptionCond("self", "0", "error_null"));
                // poniendo los valores por defecto en el constructor
                if (item.Id.Id == "init" || (methodcontext.actual_type.Name == "Main" && item.Id.Id == "main"))
                {
                    foreach (var prop in methodcontext.propertys_class.Propertys)
                    {
                        if (prop.exp != null)
                        {
                            var s = prop.exp.Visit(this);
                            if (data.ContainsValue(s))
                            {
                                // Load STR
                                var exp2 = methodcontext.GenLocal("exp", true);
                                methodcontext.Staments.Add(new CIL_LoadStr(s, exp2));
                                s = exp2;
                            }
                            methodcontext.Staments.Add(new CIL_SetAttr("self", prop.decl.id.Id, s, methodcontext.actual_type.Name));
                        }
                    }
                }
                Visit(item);
            }

            listtypes.Add(new CIL_ClassDef(node.Id.Id, new CIL_ListNode <CIL_ClassAttr>(lattr), new CIL_ListNode <CIL_ClassMethod>(lmeth)));
            return("");
        }
예제 #4
0
        public override AST_Node VisitClasslist([NotNull] CoolParser.ClasslistContext context)
        {
            List <AST_ClassDef> li = new List <AST_ClassDef>();

            foreach (var item in context.classdefine())
            {
                AST_ClassDef i = (AST_ClassDef)Visit(item);
                li.Add(i);
            }
            return(new AST_Root(context, new AST_Node[] { new AST_ListClass(context, li) }));
        }
        public bool Visit(AST_ClassDef node)
        {
            bool solve = true;

            CurrContext = CurrContext.CreateChild();
            SemanticType father = All_Types[node.Id.Id].Father;

            while (true)
            {
                var my_atributes = father.GetAllAttr();
                foreach (var attr in my_atributes)
                {
                    if (CurrContext.IsDefine(attr.Id))
                    {
                        solve = false;
                        CurrErrorLoger.LogError(node.row, node.col, "Propiedad " + attr.Id + " previamente definida");
                    }
                    CurrContext.Define(attr.Id);
                }
                father = father.Father;
                if (father == null)
                {
                    break;
                }
            }

            foreach (var prop in node.Property_list.Propertys)
            {
                if (CurrContext.IsDefine(prop.decl.id.Id))
                {
                    solve = false;
                    CurrErrorLoger.LogError(prop.decl.row, prop.decl.col, "Propiedad " + node.Id + " previamente definida");
                }
                else
                {
                    CurrContext.Define(prop.decl.id.Id);
                }
            }

            solve = node.Method_list.Visit(this);
            if (!CurrContext.NullFather())
            {
                CurrContext = CurrContext.GetParent();
            }
            return(solve);
        }
예제 #6
0
        public bool Visit(AST_ClassDef node)
        {
            if (node.Id.Id == "Main")
            {
                if (!All_Types["Main"].HasMethod("main"))
                {
                    CurrErrorLoger.LogError(node.row, node.col, "Tiene que tener un metodo main");
                    return(false);
                }
            }

            bool solve = true;

            solve &= node.Property_list.Visit(this);

            solve &= node.Method_list.Visit(this);

            SemanticType curr = All_Types[node.Id.Id];

            var my_methods = curr.Methods;

            while (curr.Father != null)
            {
                var curr_father = curr.Father;

                if (curr_father.Name == "Bool" || curr_father.Name == "String" || curr_father.Name == "Int")
                {
                    CurrErrorLoger.LogError(node.row, node.col, "No se puede heredar de los tipos built_int");
                    return(false);
                }
                var father_method = curr_father.Methods;

                foreach (var mine in my_methods)
                {
                    foreach (var him in father_method)
                    {
                        if (mine.Name == him.Name && mine.Name != "init")
                        {
                            if (mine.AttrParams.Count != him.AttrParams.Count)
                            {
                                CurrErrorLoger.LogError(node.row, node.col, "Para sobresicribir metodos deben tener la misma signatura");
                                solve = false;
                            }
                            else
                            {
                                var x = All_Types[node.Id.Id].GetMethod(mine.Name);
                                var y = curr_father.GetMethod(him.Name);
                                if (x.Name != y.Name || x.ReturnType.Name != y.ReturnType.Name)
                                {
                                    solve = false;
                                    CurrErrorLoger.LogError(node.row, node.col, "Tiene que ser el mismo tipo de retorno para la redefinicion de metodos");
                                }
                                else
                                {
                                    for (int i = 0; i < mine.AttrParams.Count; i++)
                                    {
                                        if (mine.AttrParams[i].Type.Name != him.AttrParams[i].Type.Name)
                                        {
                                            solve = false;
                                            CurrErrorLoger.LogError(node.row, node.col, "Tienen que ser del mismo tipo los parametros para la redefinicion de metodos");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                curr = curr.Father;
            }



            return(solve);
        }
예제 #7
0
 public Base_Object_Value Visit(AST_ClassDef node)
 {
     throw new NotImplementedException();
 }