예제 #1
0
        public override AST_Node VisitDispatch([NotNull] CoolParser.DispatchContext context)
        {
            var arg = (AST_StamentList)Visit(context.argexpr());
            var id  = new AST_Id(context.ID(), context.ID().GetText());

            return(new AST_Call(context, id, arg));
        }
 public bool Visit(AST_Id node)
 {
     if (!CurrContext.IsDefine(node.Id) && node.Id != "self")
     {
         CurrErrorLoger.LogError(node.row, node.col, $"{node.Id} no esta definido");
     }
     return(CurrContext.IsDefine(node.Id) || node.Id == "self");
 }
예제 #3
0
        public override AST_Node VisitExplicitdispatch([NotNull] CoolParser.ExplicitdispatchContext context)
        {
            AST_Expresion expr = (AST_Expresion)Visit(context.expr());
            var           typ  = (context.TYPE() == null) ? null : new AST_Type_Node(context.TYPE(), context.TYPE().GetText());;
            var           arg  = (AST_StamentList)Visit(context.argexpr());
            var           id   = new AST_Id(context.ID(), context.ID().GetText());

            return(new AST_ExpCall(context, expr, id, typ, arg));
        }
예제 #4
0
        public bool Visit(AST_Id node)
        {
            SemanticType my_type;

            if (node.Id == "self")
            {
                my_type = CurrType;
            }
            else if ((my_type = CurrContext.GetType(node.Id)) == null)
            {
                CurrErrorLoger.LogError(node.row, node.col, "La variable " + node.Id + "no tiene tipo");
                return(false);
            }
            node.MyType = my_type;
            return(true);
        }
예제 #5
0
        public override AST_Node VisitFeatureprop([NotNull] CoolParser.FeaturepropContext context)
        {
            var           v      = context.property();
            var           formal = v.formal();
            AST_Id        id     = new AST_Id(formal.ID(), formal.ID().GetText());
            AST_Type_Node type   = new AST_Type_Node(formal.TYPE(), formal.TYPE().GetText());
            AST_Expresion exp    = null;

            if (v.expr() != null)
            {
                exp = (AST_Expresion)Visit(v.expr());
            }
            var formald = new AST_FormalDec(v.formal(), id, type);

            return(new AST_ClassProperty(context, formald, exp));
        }
예제 #6
0
        public override AST_Node VisitMethod([NotNull] CoolParser.MethodContext context)
        {
            AST_Id                   id     = new AST_Id(context.ID(), context.ID().GetText());
            AST_Type_Node            type   = new AST_Type_Node(context.TYPE(), context.TYPE().GetText());
            List <AST_ClassProperty> param  = new List <AST_ClassProperty>();
            AST_Expresion            corpus = (AST_Expresion)Visit(context.expr());

            foreach (var item in context.formal())
            {
                var iid             = new AST_Id(item.ID(), item.ID().GetText());
                var ity             = new AST_Type_Node(item.TYPE(), item.TYPE().GetText());
                var formald         = new AST_FormalDec(item, iid, ity);
                AST_ClassProperty i = new AST_ClassProperty(item, formald, null);
                param.Add(i);
            }
            return(new AST_MethodDef(context, id, type, new AST_ListProp(context, param), corpus));
        }
예제 #7
0
 public string Visit(AST_Id node)
 {
     if (methodcontext.GetId(node.Id) == null && methodcontext.arg.Contains(node.Id))
     {
         return(node.Id);
     }
     else if (methodcontext.GetId(node.Id) == null && methodcontext.actual_type.HasAttr(node.Id))
     {
         //methodcontext.Staments.Add(new CIL_ExceptionCond("self", "0", "error_null"));
         var exp = methodcontext.GenLocal("get_attr", true);
         methodcontext.Staments.Add(new CIL_GetAttr("self", node.Id, exp, methodcontext.actual_type.Name));
         return(exp);
     }
     else
     {
         return(methodcontext.GetId(node.Id));
     }
 }
예제 #8
0
        public override AST_Node VisitClassdefine([NotNull] CoolParser.ClassdefineContext context)
        {
            AST_Id        id  = new AST_Id(context.TYPE(0), context.TYPE(0).GetText());
            AST_Type_Node inh = new AST_Type_Node(context.TYPE(0), "Object");

            if (context.TYPE().Length > 1)
            {
                inh = new AST_Type_Node(context.TYPE(1), context.TYPE(1).GetText());
            }
            List <AST_ClassProperty> prop = new List <AST_ClassProperty>();
            List <AST_MethodDef>     meth = new List <AST_MethodDef>();

            foreach (var item in context.feature())
            {
                var t = Visit(item);
                if (t is AST_ClassProperty)
                {
                    prop.Add((AST_ClassProperty)t);
                }
                else
                {
                    meth.Add((AST_MethodDef)t);
                }
            }
            foreach (var item in prop)
            {
                if (item.exp == null)
                {
                    if (item.decl.type.Type == "Int")
                    {
                        item.exp = new AST_Cte(context, new AST_Token("0", "Int"));
                    }
                    else if (item.decl.type.Type == "Bool")
                    {
                        item.exp = new AST_Cte(context, new AST_Token("false", "false"));
                    }
                    else if (item.decl.type.Type == "String")
                    {
                        item.exp = new AST_StringCte(item.row, item.col, "\"\"");
                    }
                }
            }
            return(new AST_ClassDef(context, id, new AST_ListProp(context, prop), new AST_ListMethod(context, meth), inh));
        }
예제 #9
0
        public override AST_Node VisitLet([NotNull] CoolParser.LetContext context)
        {
            List <AST_ClassProperty> param  = new List <AST_ClassProperty>();
            AST_Expresion            corpus = (AST_Expresion)Visit(context.expr());

            foreach (var item in context.property())
            {
                var           iid     = new AST_Id(item.formal().ID(), item.formal().ID().GetText());
                var           ity     = new AST_Type_Node(item.formal().TYPE(), item.formal().TYPE().GetText());
                var           formald = new AST_FormalDec(item, iid, ity);
                AST_Expresion subexp  = null;
                if (item.expr() != null)
                {
                    subexp = (AST_Expresion)Visit(item.expr());
                }
                AST_ClassProperty i = new AST_ClassProperty(item, formald, subexp);
                param.Add(i);
            }
            return(new AST_Let(context, new AST_ListProp(context, param), corpus));
        }
예제 #10
0
 public bool Visit(AST_Id node)
 {
     return(!Types.Contains(node.Id) && !ReservedWords.Contains(node.Id));
 }
예제 #11
0
 public bool Visit(AST_Id node)
 {
     throw new NotImplementedException();
 }
예제 #12
0
 public Base_Object_Value Visit(AST_Id node)
 {
     return(memo.GetValue(node.Id));
 }