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"); } }
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); }
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")); } }
public override void GetIntCode(BuildICCode codeManager) { codeManager.UnaryOperationCheck(this); if (codeManager.special_object_return_type) { codeManager.SetReturnType("Int"); } }
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); } }
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); } }
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); } }
public override void GetIntCode(BuildICCode codeManager) { codeManager.codeLines.Add(new ICAssignVarToVar(codeManager.variableManager.PeekCounter(), 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)); } }