Beispiel #1
0
        //private string v;
        //private ObjClass Type;

        //private Node s;

        public AttributeNode(CoolParser.AttribFeatureContext context, Node s) : base(s.Childs)
        {
            CoolParser.ClassdefContext p = (CoolParser.ClassdefContext)context.Parent;
            var classname = p.t.Text;
            var type      = "Object";

            if (context.t.Text != null)// if I have a type
            {
                type = context.t.Text;
            }
            var name = context.id.Text;

            this.SetType(SymbolTable.Classes[type]);
            //Atribute c;
            //if (SymbolTable.Classes.ContainsKey(type) && !(SymbolTable.Classes[classname].Attributes.ContainsKey(name)))// if you know my type and not myself
            {
                this.Name = name;
                //c = new Atribute(name, SymbolTable.Classes[type])
                {
                    this.Expression = context.expresion();
                    this.Self       = context;
                }//;
                SymbolTable.Classes[classname].Attributes.Add(Name, this);//let me introduce myself
            }
            this.context = context;
            //this.s = s;
        }
Beispiel #2
0
 public override object VisitAttribFeature([NotNull] CoolParser.AttribFeatureContext context)
 {
     CoolParser.ClassdefContext p = (CoolParser.ClassdefContext)(context.Parent);
     dotcode += p.t.Text + "->" + context.id.Text + "\n";
     dotcode += context.id.Text + "[label=\"" + context.id.Text + ":" + context.t.Text + "\nattribute\"]\n";
     return(VisitChildren(context));
 }
        public override object VisitClassdef([NotNull] CoolParser.ClassdefContext context)
        {
            List <Method>    methods    = new List <Method>();
            List <Attribute> attributes = new List <Attribute>();

            foreach (var child in context.feature())
            {
                var result = Visit(child);
                if (result is Method)
                {
                    methods.Add(result as Method);
                }
                else
                {
                    attributes.Add(result as Attribute);
                }
            }
            Coord c             = GetCoord(context);
            Type  inheritedType = null;

            if (context.INHERITS() != null)
            {
                if (p.Types.ContainsKey(context.TYPE()[1].GetText()))
                {
                    inheritedType = p.Types[context.TYPE()[1].GetText()];
                }
                else
                {
                    inheritedType = new Type(context.TYPE()[1].GetText(), null, new Coord(0, 0));
                    p.Types[context.TYPE()[1].GetText()] = inheritedType;
                }
            }

            return(new Type(context.TYPE()[0].GetText(), methods, attributes, inheritedType, c));
        }
        public override Node VisitMethodFeature([NotNull] CoolParser.MethodFeatureContext context)
        {
            CoolParser.ClassdefContext p = (CoolParser.ClassdefContext)context.Parent;
            var classname = p.t.Text;
            //var type = "Object";
            //if (context.TYPE().GetText() != null)
            //    type = context.TYPE().GetText();
            //var name = context.ID().GetText();
            //Method c;
            //if (SymbolTable.Classes.ContainsKey(type) && !(SymbolTable.Classes[classname].Methods.ContainsKey(name)))// if you know my type and not myself
            //{
            //    c = new Method(name, SymbolTable.Classes[type])
            //    {
            //        Expression = context.expresion(),// this shouln't be on the ctor
            //        Self = context
            //    };
            //    SymbolTable.Classes[classname].Methods.Add(c.Name, c);//let me introduce myself
            //    var formals = context.formal();
            //    foreach (var item in formals)// add the parameters of the method
            //    {
            //        SymbolTable.Classes[classname].Methods[name].Params.Add(item.id.Text, new Atribute(item.id.Text, SymbolTable.Classes[item.t.Text]));
            //    }
            //}
            //this.currentMethod = name;
            //this.currentClass = classname;

            var s = VisitChildren(context);

            chec_typeAdded(s, context, classname);

            return(new MethodNode(context, s));
        }
Beispiel #5
0
        public override Node VisitClassdef([NotNull] CoolParser.ClassdefContext context)
        {
            var s    = VisitChildren(context);
            var name = context.TYPE(0).GetText();
            var n    = SymbolTable.Classes[name];

            n.Context = context;
            n.Childs  = s.Childs;
            return(n);
            //return new ClassNode(context, s);
        }
Beispiel #6
0
        //public object VisitChildren(IRuleNode node)
        //{
        //    throw new NotImplementedException();
        //}

        //public object VisitTerminal(ITerminalNode node)
        //{
        //    throw new NotImplementedException();
        //}

        //public object VisitErrorNode(IErrorNode node)
        //{
        //    throw new NotImplementedException();
        //}
        //public override

        public override object VisitClassdef([NotNull] CoolParser.ClassdefContext context)
        {
            dotcode += "program->" + context.t.Text + "\n";
            dotcode += context.t.Text + "[label=\"" + context.t.Text;
            if (context.it != null)
            {
                dotcode += ":" + context.it.Text;
            }
            dotcode += "\nclass\"]\n";
            return(VisitChildren(context));
        }
Beispiel #7
0
        public ClassNode(CoolParser.ClassdefContext context, Node s) : base(s.Childs)
        {
            Name = context.TYPE(0).GetText();
            Type = Name;
            //this = SymbolTable.Classes[Name];

            this.Context = context;

            Attributes = new Dictionary <string, AttributeNode>();
            Methods    = new Dictionary <string, MethodNode>();
        }
        public MethodNode(CoolParser.MethodFeatureContext context, Node s) : base(s.Childs)
        {
            Symbols = new Dictionary <string, ClassNode>();
            Params  = new Dictionary <string, AttributeNode>();
            //Variables = new Dictionary<string, AttributeNode>();

            CoolParser.ClassdefContext p = (CoolParser.ClassdefContext)context.Parent;
            var classname = p.t.Text;
            var type      = "Object";

            if (context.TYPE().GetText() != null)
            {
                type = context.TYPE().GetText();
            }

            var name = context.ID().GetText();

            Name = name;
            SetType(SymbolTable.Classes[type]);
            //Method c;
            if (SymbolTable.Classes.ContainsKey(type) && !(SymbolTable.Classes[classname].Methods.ContainsKey(name)))// if you know my type and not myself
            {
                //c = new Method(name, SymbolTable.Classes[type])
                {
                    Expression = context.expresion();// this shouln't be on the ctor
                    Self       = context;
                }
                SymbolTable.Classes[classname].Methods.Add(Name, this);//let me introduce myself
                var formals = context.formal();
                //foreach (var item in formals)// add the parameters of the method
                //{
                //    //SymbolTable.Classes[classname].Methods[name].Params.Add(item.id.Text, new FormalNode(item.id.Text, SymbolTable.Classes[item.t.Text]));
                //}
                foreach (var item in Childs)
                {
                    try{ SymbolTable.Classes[classname].Methods[name].Params.Add(((FormalNode)item).ID, new AttributeNode(((FormalNode)item).ID, ((FormalNode)item).GetType())); }catch (System.Exception) {}
                }
            }
            this.context = context;
            var d = (CoolParser.ClassdefContext)context.Parent;

            this.ClassName = d.TYPE(0).GetText();// + ".";
            //this.Childs = s.Childs;
            this.Name = context.ID().GetText();
            if (ClassName.ToLower() == "main")
            {
                ClassName = "";
            }
            foreach (var item in Params)
            {
                Symbols.Add(item.Key, item.Value.GetType());// maybe here we could make a dict of atributes but i think this will be harder after in other places and since i only need the class :)
            }
        }
        public override ASTNode VisitClassdef([NotNull] CoolParser.ClassdefContext context)
        {
            var classNode = new ClassNode(context);

            var typeClass = new TypeNode(context.TYPE(0).Symbol.Line,
                                         context.TYPE(0).Symbol.Column, context.TYPE(0).GetText());

            classNode.TypeClass = typeClass;

            var inheritType = context.TYPE(1) == null ? new TypeNode(0, 0, "Object") :
                              new TypeNode(context.TYPE(1).Symbol.Line, context.TYPE(1).Symbol.Column, context.TYPE(1).GetText());

            classNode.TypeClassInherit = inheritType;
            classNode.Features         = (from x in context.feature() select Visit(x) as FeatureNode).ToList();
            return(classNode);
        }
Beispiel #10
0
        public override object VisitMethodFeature([NotNull] CoolParser.MethodFeatureContext context)
        {
            CoolParser.ClassdefContext p = (CoolParser.ClassdefContext)(context.Parent);
            dotcode += p.t.Text + "->" + context.id.Text + "\n";
            dotcode += context.id.Text + "[label=\"" + context.id.Text;
            if (context.t != null)
            {
                dotcode += ":" + context.t.Text;
            }
            dotcode += "\nmethod\"]\n";
            // TODO fix signature of methods in dotcode?
            // do not make a new node for each formal
            var fs = context.formal();

            foreach (var item in fs)
            {
                dotcode += context.id.Text + "->" + item.id.Text + "\n";
                dotcode += item.id.Text + "[label=\"" + item.id.Text + ":" + item.t.Text + "\nformal\"]\n";
            }
            return(VisitChildren(context));
        }
 /// <summary>
 /// Visit a parse tree produced by <see cref="CoolParser.classdef"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitClassdef([NotNull] CoolParser.ClassdefContext context)
 {
     return(VisitChildren(context));
 }
Beispiel #12
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="CoolParser.classdef"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitClassdef([NotNull] CoolParser.ClassdefContext context)
 {
 }
Beispiel #13
0
 public override bool VisitClassdef([NotNull] CoolParser.ClassdefContext context)
 {
     return(VisitChildren(context));
 }