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; }
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; }