public void Visit(LabelCodeLine line) { if (line.Head[0] != '_') { current_function = line.Label; size = Preprocessor.GetFunctionVarsSize(current_function); } MIPSCode.Add($"\n"); MIPSCode.Add($"{line.Label}:"); MIPSCode.Add($"li $t9, 0"); }
public void Visit(ClassNode node) { // Handle Inheritance string @class = VariableManager.CurrentClass = node.type.Text; Code.Add(new InherCodeLine(node.type.Text, Scope.GetType(node.type.Text).Parent.Text)); int self = VariableManager.VariableCounter = 0; VariableManager.IncrementVariableCounter(); VariableManager.PushVariableCounter(); // Handle Methods and Properties List <PropertyNode> properties = new List <PropertyNode>(); List <MethodNode> methods = new List <MethodNode>(); foreach (var feature in node.features) { if (feature is PropertyNode) { properties.Add(feature as PropertyNode); } else { methods.Add(feature as MethodNode); } } foreach (var method in methods) { method.Accept(this); } //Begin constructor function Code.Add(new LabelCodeLine(VariableManager.CurrentClass, "constructor")); Code.Add(new ParamCodeLine(self)); //Call first the parent constructor function if (VariableManager.CurrentClass != "Object") { Code.Add(new PushParamCodeLine(self)); LabelCodeLine label = new LabelCodeLine(node.Inherit.Text, "constructor"); Code.Add(new CallLblCodeLine(label)); Code.Add(new PopParamCodeLine(1)); } foreach (var method in methods) { (string ClassName, string MethodName)label = ClassManager.GetDefinition(node.type.Text, method.id.text); Code.Add(new AssignLblToMemCodeLine(self, new LabelCodeLine(label.ClassName, label.MethodName), ClassManager.GetOffset(node.type.Text, method.id.text))); } foreach (var property in properties) { VariableManager.PushVariableCounter(); property.Accept(this); VariableManager.PopVariableCounter(); Code.Add(new CommentCodeLine("set attribute: " + property.formal.id.text)); Code.Add(new AssignVarToMemCodeLine(self, VariableManager.PeekVariableCounter(), ClassManager.GetOffset(node.type.Text, property.formal.id.text))); } Code.Add(new CommentCodeLine("set class name: " + node.type.Text)); Code.Add(new AssignStrToMemCodeLine(0, node.type.Text, 0)); Code.Add(new CommentCodeLine("set class size: " + ClassManager.GetClassSize(node.type.Text) + " words")); Code.Add(new AssignConstToMemCodeLine(0, ClassManager.GetClassSize(node.type.Text), 1)); Code.Add(new CommentCodeLine("set class generation label")); Code.Add(new AssignLblToMemCodeLine(0, new LabelCodeLine("_class", node.type.Text), 2)); Code.Add(new ReturnCodeLine(-1)); VariableManager.PopVariableCounter(); }