Beispiel #1
0
 public void Visit(LabelLine line)
 {
     if (line.Head[0] != '_')
     {
         current_function = line.Label;
         size             = annotation.FunctionVarsSize[current_function];
     }
     Code.Add($"\n");
     Code.Add($"{line.Label}:");
     Code.Add($"li $t9, 0");
 }
 public ConditionalJump(int conditional_var, LabelLine label)
 {
     Label          = label;
     ConditionalVar = conditional_var;
 }
Beispiel #3
0
        public void Visit(ClassNode node)
        {
            string cclass;

            cclass = VariableManager.CurrentClass = node.TypeClass.Text;
            IC.Add(new Inherit(node.TypeClass.Text, Scope.GetType(node.TypeClass.Text).Parent.Text));

            //VirtualTable.DefineClass(VariableManager.CurrentClass);
            int self = VariableManager.VariableCounter = 0;

            VariableManager.IncrementVariableCounter();
            VariableManager.PushVariableCounter();

            List <AttributeNode> attributes = new List <AttributeNode>();
            List <MethodNode>    methods    = new List <MethodNode>();

            foreach (var f in node.FeatureNodes)
            {
                if (f is AttributeNode)
                {
                    attributes.Add((AttributeNode)f);
                }
                else
                {
                    methods.Add((MethodNode)f);
                }
            }


            foreach (var method in methods)
            {
                method.Accept(this);
            }


            //begin constructor function

            IC.Add(new LabelLine(VariableManager.CurrentClass, "constructor"));
            IC.Add(new Param(self));

            //calling first the parent constructor method
            if (VariableManager.CurrentClass != "Object")
            {
                IC.Add(new PushParam(self));
                LabelLine label = new LabelLine(node.TypeInherit.Text, "constructor");
                IC.Add(new CallLabel(label));
                IC.Add(new PopParam(1));
            }


            foreach (var method in methods)
            {
                (string, string)label = VirtualTable.GetDefinition(node.TypeClass.Text, method.Id.Text);
                IC.Add(new CommentLine("set method: " + label.Item1 + "." + label.Item2));
                IC.Add(new AssignmentLabelToMemory(self, new LabelLine(label.Item1, label.Item2), VirtualTable.GetOffset(node.TypeClass.Text, method.Id.Text)));
                //IntermediateCode.Add(new AssignmentVariableToMemory(self, VariableManager.VariableCounter, IntermediateCode.GetVirtualTableOffset(node.TypeClass.Text, attr.Formal.Id.Text)));
            }


            foreach (var attr in attributes)
            {
                VariableManager.PushVariableCounter();
                attr.Accept(this);
                VariableManager.PopVariableCounter();
                IC.Add(new CommentLine("set attribute: " + attr.Formal.Id.Text));
                IC.Add(new AssignmentVariableToMemory(self, VariableManager.PeekVariableCounter(), VirtualTable.GetOffset(node.TypeClass.Text, attr.Formal.Id.Text)));
            }


            IC.Add(new CommentLine("set class name: " + node.TypeClass.Text));
            IC.Add(new AssignmentStringToMemory(0, node.TypeClass.Text, 0));
            IC.Add(new CommentLine("set class size: " + VirtualTable.GetSizeClass(node.TypeClass.Text) + " words"));
            IC.Add(new AssignmentConstantToMemory(0, VirtualTable.GetSizeClass(node.TypeClass.Text), 1));
            IC.Add(new CommentLine("set class generation label"));
            IC.Add(new AssignmentLabelToMemory(0, new LabelLine("_class", node.TypeClass.Text), 2));

            IC.Add(new Return(-1));

            VariableManager.PopVariableCounter();
        }
 public GotoJump(LabelLine label)
 {
     Label = label;
 }