public override void GetIntCode(BuildICCode codeManager)
        {
            codeManager.variableManager.PushCounter();

            foreach (var attr in this.Sentences)
            {
                codeManager.variableManager.IncreaseCounter();
                codeManager.variableManager.Push(attr.Formal.Id.Text, attr.Formal.Type.Text);
                codeManager.variableManager.PushCounter();
                attr.GetIntCode(codeManager);
            }
            codeManager.variableManager.IncreaseCounter();

            Body.GetIntCode(codeManager);

            foreach (var attr in Sentences)
            {
                codeManager.variableManager.Pop(attr.Formal.Id.Text);
            }

            codeManager.variableManager.PopCounter();

            if (codeManager.special_object_return_type)
            {
                codeManager.SetReturnType(StaticType.Text);
            }
        }
 public override void GetIntCode(BuildICCode codeManager)
 {
     RightExpression.GetIntCode(codeManager);
     var(x, type) = codeManager.variableManager.Peek(Id.Text);
     if (type is null)
     {
         type = codeManager.virtualTable.getAttrType(codeManager.variableManager.ClassName, Id.Text);
     }
     if ((RightExpression.StaticType.Text == "Int" ||
          RightExpression.StaticType.Text == "Bool" ||
          RightExpression.StaticType.Text == "String") &&
         type == "Object")
     {
         codeManager.codeLines.Add(new ICPushParams(codeManager.variableManager.PeekCounter()));
         codeManager.codeLines.Add(new ICCallLabel(new ICLabel("_wrapper", RightExpression.StaticType.Text),
                                                   codeManager.variableManager.PeekCounter()));
         codeManager.codeLines.Add(new ICPopParams(1));
     }
     if (x != -1)
     {
         codeManager.codeLines.Add(new ICAssignVarToVar(x, codeManager.variableManager.PeekCounter()));
     }
     else
     {
         var offset = codeManager.virtualTable.getOffset(codeManager.variableManager.ClassName, Id.Text);
         codeManager.codeLines.Add(new ICAssignVarToMem(0, codeManager.variableManager.PeekCounter(), offset));
     }
 }
        public override void GetIntCode(BuildICCode codeManager)
        {
            codeManager.codeLines.Add(new ICLabel(codeManager.variableManager.ClassName, Id.Text));
            codeManager.special_object_return_type = TypeReturn.Text == "Object";
            int self = codeManager.variableManager.VarCount = 0;

            codeManager.codeLines.Add(new ICParams(self));

            if (codeManager.special_object_return_type)
            {
                codeManager.variableManager.IncreaseCounter();
            }
            codeManager.variableManager.IncreaseCounter();

            foreach (var f in Arguments)
            {
                codeManager.codeLines.Add(new ICParams(codeManager.variableManager.VarCount));
                codeManager.variableManager.Push(f.Id.Text, f.Type.Text);
                codeManager.variableManager.IncreaseCounter();
            }
            codeManager.variableManager.PushCounter();
            Body.GetIntCode(codeManager);
            if (codeManager.special_object_return_type)
            {
                codeManager.retObject();
            }
            codeManager.codeLines.Add(new ICReturn(codeManager.variableManager.PeekCounter()));
            codeManager.variableManager.PopCounter();
            foreach (var f in Arguments)
            {
                codeManager.variableManager.Pop(f.Id.Text);
            }
            codeManager.special_object_return_type = false;
        }
        public override void GetIntCode(BuildICCode codeManager)
        {
            if (LeftOperand is IntegerNode && RightOperand is IntegerNode)
            {
                int v = 0;
                switch (Symbol)
                {
                case "+":
                    v = ((IntegerNode)LeftOperand).Value + ((IntegerNode)RightOperand).Value;
                    break;

                case "-":
                    v = ((IntegerNode)LeftOperand).Value - ((IntegerNode)RightOperand).Value;
                    break;

                case "*":
                    v = ((IntegerNode)LeftOperand).Value * ((IntegerNode)RightOperand).Value;
                    break;

                case "/":
                    v = ((IntegerNode)LeftOperand).Value / ((IntegerNode)RightOperand).Value;
                    break;
                }
                codeManager.codeLines.Add(new ICAssignConstToVar(codeManager.variableManager.PeekCounter(), v));
            }
            else
            {
                codeManager.BinaryOperationCheck(this);
            }
            if (codeManager.special_object_return_type)
            {
                codeManager.SetReturnType("Int");
            }
        }
Example #5
0
 public override void GetIntCode(BuildICCode codeManager)
 {
     foreach (var e in Secuence)
     {
         e.GetIntCode(codeManager);
     }
 }
        public override void GetIntCode(BuildICCode codeManager)
        {
            string _class = TypeBase.Text;

            codeManager.codeLines.Add(new ICAssignVarToVar(codeManager.variableManager.PeekCounter(), 0));
            codeManager.Dispatch(this, _class);
        }
Example #7
0
 public override void GetIntCode(BuildICCode codeManager)
 {
     codeManager.BinaryOperationCheck(this);
     if (codeManager.special_object_return_type)
     {
         codeManager.codeLines.Add(new ICAssignStrToVar(BuildICCode.return_type_variable, "Bool"));
     }
 }
Example #8
0
 public override void GetIntCode(BuildICCode codeManager)
 {
     codeManager.UnaryOperationCheck(this);
     if (codeManager.special_object_return_type)
     {
         codeManager.SetReturnType("Int");
     }
 }
Example #9
0
 public override void GetIntCode(BuildICCode codeManager)
 {
     codeManager.codeLines.Add(new ICAssignConstToVar(codeManager.variableManager.PeekCounter(), Value));
     if (codeManager.special_object_return_type)
     {
         codeManager.SetReturnType("Int");
     }
 }
        public override void GetIntCode(BuildICCode codeManager)
        {
            string tag = codeManager.codeLines.Count.ToString();

            codeManager.codeLines.Add(new ICLabel("_whilecond", tag));
            Condition.GetIntCode(codeManager);
            codeManager.codeLines.Add(new ICCondJump(codeManager.variableManager.PeekCounter(),
                                                     new ICLabel("_endwhile", tag)));
            Body.GetIntCode(codeManager);
            codeManager.codeLines.Add(new ICJump(new ICLabel("_whilecond", tag)));
            codeManager.codeLines.Add(new ICLabel("_endwhile", tag));
        }
 public override void GetIntCode(BuildICCode codeManager)
 {
     DessignateExpression.GetIntCode(codeManager);
     if ((DessignateExpression.StaticType.Text == "Int" ||
          DessignateExpression.StaticType.Text == "Bool" ||
          DessignateExpression.StaticType.Text == "String") &&
         Formal.Type.Text == "Object")
     {
         codeManager.codeLines.Add(new ICPushParams(codeManager.variableManager.PeekCounter()));
         codeManager.codeLines.Add(new ICCallLabel(new ICLabel("_wrapper", DessignateExpression.StaticType.Text),
                                                   codeManager.variableManager.PeekCounter()));
         codeManager.codeLines.Add(new ICPopParams(1));
     }
 }
 public override void GetIntCode(BuildICCode codeManager)
 {
     if (Operand.StaticType.Text == "Int" || Operand.StaticType.Text == "String" || Operand.StaticType.Text == "Bool")
     {
         codeManager.codeLines.Add(new ICAssignConstToVar(codeManager.variableManager.PeekCounter(), 0));
     }
     else
     {
         codeManager.UnaryOperationCheck(this);
     }
     if (codeManager.special_object_return_type)
     {
         codeManager.SetReturnType("Bool");
     }
 }
 public override void GetIntCode(BuildICCode codeManager)
 {
     var(x, type) = codeManager.variableManager.Peek(Text);
     if (x != -1)
     {
         codeManager.codeLines.Add(new ICAssignVarToVar(codeManager.variableManager.PeekCounter(), x));
     }
     else
     {
         codeManager.codeLines.Add(new ICAssignMemToVar(codeManager.variableManager.PeekCounter(), 0,
                                                        codeManager.virtualTable.getOffset(codeManager.variableManager.ClassName, Text)));
     }
     if (codeManager.special_object_return_type)
     {
         codeManager.SetReturnType(type);
     }
 }
Example #14
0
        public override void GetIntCode(BuildICCode codeManager)
        {
            var classes = new List <ClassNode>();

            classes.AddRange(ClassNodes);
            classes.Sort((x, y) => codeManager.scope.GetType(x.TypeClass.Text) <=
                         codeManager.scope.GetType(y.TypeClass.Text) ? 1 : -1);
            foreach (var _class in classes)
            {
                codeManager.virtualTable.insertClass(_class.TypeClass.Text);
                var attr   = new List <AttributeNode>();
                var method = new List <MethodNode>();
                foreach (var feature in _class.Features)
                {
                    if (feature is AttributeNode)
                    {
                        attr.Add(feature as AttributeNode);
                    }
                    else
                    {
                        method.Add(feature as MethodNode);
                    }
                }
                foreach (var m in method)
                {
                    var p = new List <string>();
                    foreach (var arg in m.Arguments)
                    {
                        p.Add(arg.Type.Text);
                    }
                    codeManager.virtualTable.insertMethod(_class.TypeClass.Text, m.Id.Text, p);
                }
                foreach (var a in attr)
                {
                    codeManager.virtualTable.insertAttr(_class.TypeClass.Text, a.Formal.Id.Text, a.Formal.Type.Text);
                }
            }
            foreach (var _class in classes)
            {
                _class.GetIntCode(codeManager);
            }
        }
Example #15
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                throw new ArgumentException("Invalid params count");
            }
            Console.WriteLine("Cool Compiler");
            var input  = args[0];
            var output = args[1];
            //var input = "C:\\Users\\Kike-PC\\Desktop\\CoolCompiler\\TestCases\\CodeGeneration\\hello_world.cl";
            //var output = "C:\\Users\\Kike-PC\\Desktop\\CoolCompiler\\TestCases\\CodeGeneration\\hello.s";
            DirectoryInfo dirInfo = new DirectoryInfo(input);
            //FileInfo files = dirInfo.GetFiles();

            FileInfo             file        = new FileInfo(input);
            ASTNode              root        = ParseInput(file.FullName);
            Scope                scope       = new Scope();
            List <SemanticError> errors      = new List <SemanticError>();
            ProgramNode          rootProgram = root as ProgramNode;

            SemanticCheck.CheckAST(rootProgram, errors, scope);
            if (errors.Count > 0)
            {
                foreach (SemanticError error in errors)
                {
                    Console.WriteLine(error.Type);
                    Console.WriteLine(error.Line + ":" + error.Column);
                }
            }
            else
            {
                var bc = new BuildICCode(rootProgram, scope);
                var s  = WMIPS.Generate(bc.GetIntCode());
                File.WriteAllText(output, s);
            }
            Console.WriteLine("Finished:");
        }
        public override void GetIntCode(BuildICCode codeManager)
        {
            if (Type.Text == "Int" || Type.Text == "Bool")
            {
                codeManager.codeLines.Add(new ICAssignConstToVar(codeManager.variableManager.PeekCounter(), 0));
            }
            else if (Type.Text == "String")
            {
                codeManager.codeLines.Add(new ICAssignStrToVar(codeManager.variableManager.PeekCounter(), ""));
            }
            else
            {
                int s = codeManager.virtualTable.SizeOf(Type.Text);
                codeManager.codeLines.Add(new ICAllocation(codeManager.variableManager.PeekCounter(), s));
                codeManager.codeLines.Add(new ICPushParams(codeManager.variableManager.PeekCounter()));
                codeManager.codeLines.Add(new ICCallLabel(new ICLabel(Type.Text, "ctor")));
                codeManager.codeLines.Add(new ICPopParams(1));
            }

            if (codeManager.special_object_return_type)
            {
                codeManager.SetReturnType(Type.Text);
            }
        }
Example #17
0
 public override void GetIntCode(BuildICCode codeManager)
 {
     codeManager.codeLines.Add(new ICAssignVarToVar(codeManager.variableManager.PeekCounter(), 0));
 }
Example #18
0
 public override void GetIntCode(BuildICCode codeManager)
 {
     throw new NotImplementedException();
 }
        public override void GetIntCode(BuildICCode codeManager)
        {
            string _class;

            _class = codeManager.variableManager.ClassName = TypeClass.Text;
            codeManager.codeLines.Add(new ICInheritance(TypeClass.Text,
                                                        codeManager.scope.GetType(TypeClass.Text).Parent.Text));

            var self = codeManager.variableManager.VarCount = 0;

            codeManager.variableManager.IncreaseCounter();
            codeManager.variableManager.PushCounter();
            var attr   = new List <AttributeNode>();
            var method = new List <MethodNode>();

            foreach (var feature in Features)
            {
                if (feature is AttributeNode)
                {
                    attr.Add(feature as AttributeNode);
                }
                else
                {
                    method.Add(feature as MethodNode);
                }
            }
            foreach (var m in method)
            {
                m.GetIntCode(codeManager);
            }

            // constructor
            codeManager.codeLines.Add(new ICLabel(codeManager.variableManager.ClassName, "ctor"));
            codeManager.codeLines.Add(new ICParams(self));

            // LLamar al constructor del padre
            if (codeManager.variableManager.ClassName != "Object")
            {
                codeManager.codeLines.Add(new ICPushParams(self));
                ICLabel lb = new ICLabel(TypeClassInherit.Text, "ctor");
                codeManager.codeLines.Add(new ICCallLabel(lb));
                codeManager.codeLines.Add(new ICPopParams(1));
            }

            foreach (var m in method)
            {
                (string, string)label = codeManager.virtualTable.getLabel(TypeClass.Text, m.Id.Text);
                var offset = codeManager.virtualTable.getOffset(TypeClass.Text, m.Id.Text);
                codeManager.codeLines.Add(new ICAssignLabToMem(self, new ICLabel(label.Item1, label.Item2),
                                                               offset));
            }
            foreach (var a in attr)
            {
                codeManager.variableManager.PushCounter();
                a.GetIntCode(codeManager);
                codeManager.variableManager.PopCounter();
                codeManager.codeLines.Add(new ICAssignVarToMem(self, codeManager.variableManager.PeekCounter(),
                                                               codeManager.virtualTable.getOffset(TypeClass.Text, a.Formal.Id.Text)));
            }
            // Settear el nombre, tamaƱo, etiqueta
            codeManager.codeLines.Add(new ICAssignStrToMem(0, TypeClass.Text, 0));
            codeManager.codeLines.Add(new ICAssignConstToMem(0, codeManager.virtualTable.SizeOf(TypeClass.Text), 1));
            codeManager.codeLines.Add(new ICAssignLabToMem(0, new ICLabel("_class", TypeClass.Text), 2));
            codeManager.codeLines.Add(new ICReturn(-1));
            codeManager.variableManager.PopCounter();
        }
        public override void GetIntCode(BuildICCode codeManager)
        {
            var stype = StaticType.Text;
            int res   = codeManager.variableManager.PeekCounter();
            int expr  = codeManager.variableManager.IncreaseCounter();

            codeManager.variableManager.PushCounter();
            Sentence.GetIntCode(codeManager);
            codeManager.variableManager.PopCounter();

            if (stype == "String" || stype == "Int" || stype == "Bool")
            {
                int idx = Cases.FindIndex((x) => x.Formal.Type.Text == stype);
                var v   = Cases[idx].Formal.Id.Text;

                codeManager.variableManager.Push(v, Cases[idx].Formal.Type.Text);

                int t = codeManager.variableManager.IncreaseCounter();
                codeManager.variableManager.PushCounter();

                Cases[idx].DessignateExpression.GetIntCode(codeManager);
                codeManager.variableManager.PopCounter();
                codeManager.variableManager.Pop(v);

                codeManager.codeLines.Add(new ICAssignVarToVar(codeManager.variableManager.PeekCounter(), t));
            }
            else
            {
                var tag = codeManager.codeLines.Count.ToString();
                var l   = new List <Feature.AttributeNode>();
                l.AddRange(Cases);
                l.Sort((x, y) => (codeManager.scope.GetType(x.Formal.Type.Text) <= codeManager.scope.GetType(y.Formal.Type.Text)? -1 : 1));
                for (int i = 0; i < l.Count; i++)
                {
                    codeManager.variableManager.Push(l[i].Formal.Id.Text, l[i].Formal.Type.Text);

                    var caseType = l[i].Formal.Type.Text;
                    codeManager.variableManager.PushCounter();
                    codeManager.variableManager.IncreaseCounter();

                    codeManager.codeLines.Add(new ICLabel("_case", tag + "." + i));
                    codeManager.codeLines.Add(new ICAssignStrToVar(codeManager.variableManager.VarCount, caseType));
                    codeManager.codeLines.Add(new ICArith(codeManager.variableManager.VarCount, expr, codeManager.variableManager.VarCount, "inherit"));
                    codeManager.codeLines.Add(new ICCondJump(codeManager.variableManager.VarCount, new ICLabel("_case", tag + "." + (i + 1))));

                    if (caseType == "Int" || caseType == "Bool" || caseType == "String")
                    {
                        if (stype == "Object")
                        {
                            codeManager.codeLines.Add(new ICAssignMemToVar(expr, expr, codeManager.virtualTable.SizeOf(caseType)));

                            codeManager.variableManager.PopCounter();
                            l[i].DessignateExpression.GetIntCode(codeManager);

                            codeManager.codeLines.Add(new ICAssignVarToVar(res, codeManager.variableManager.PeekCounter()));
                            codeManager.codeLines.Add(new ICJump(new ICLabel("_endcase", tag)));
                        }
                    }
                    else
                    {
                        codeManager.variableManager.PushCounter();
                        l[i].DessignateExpression.GetIntCode(codeManager);
                        codeManager.variableManager.PopCounter();

                        codeManager.codeLines.Add(new ICAssignVarToVar(res, codeManager.variableManager.PeekCounter()));
                        codeManager.codeLines.Add(new ICJump(new ICLabel("_endcase", tag)));
                    }
                    codeManager.variableManager.PopCounter();
                    codeManager.variableManager.Pop(l[i].Formal.Id.Text);
                }

                codeManager.codeLines.Add(new ICLabel("_case", tag + "." + l.Count));
                codeManager.codeLines.Add(new ICJump(new ICLabel("_caseselectionexception")));

                codeManager.codeLines.Add(new ICLabel("_endcase", tag));
            }
        }