public virtual IFunctionCil Visit(MethodContext parserRule) { IFunctionCil function; var contextCil = new ContextCil(); //El unico metodo que no pertenece a una clase es entry if (parserRule.Parent == null) { function = CilAst.GetFunctionCilsByName($"{parserRule.idText}"); } else { // El nombre metodo en el tipo tiene siempre esta estructura (Type_CoolName) function = CilAst.GetFunctionCilsByName($"{(parserRule.Parent as ClassContext).type.Text}_{parserRule.idText}"); // Como toda fucion pertenece a una clase se le agrega self como una parametro var self = new ArgCil("self"); function.ArgCils.Add(self); contextCil.Define("self"); foreach (var formal in parserRule._formals) { Visit(formal, function, contextCil); } } var result = Visit(parserRule.exprBody, function, contextCil); function.ThreeDirInses.Add(new ReturnCil(result)); return(function); }
public void Visit() { IFunctionCil init = typeCil.Init.Function; var value = new LocalCil("self"); init.LocalCils.Add(value); var typeCilNew = CilAst.GetTypeCilByName(typeCil.Name, typeCil); init.ThreeDirInses.Add(new Allocate(value, typeCilNew)); var typeCool = GlobalContext.GetType(typeCil.Name); var contextCil = new ContextCil(); contextCil.Define("self"); foreach (var typeTemp in typeCool.Hierachty) { foreach (var attributeTemp in typeTemp.Attributes) { //Inicializamos los atributos if (attributeTemp.initializacion != null) { var valueAttribute = Visit(attributeTemp.initializacion, init, contextCil); //No siempre los tipos de Cil estan para eso eso habria que hacer 2 pasadas al AST init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), valueAttribute)); } else { if (typeTemp == GlobalContext.Int || typeTemp == GlobalContext.Bool) { init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), new ValuelCil("0"))); } else if (typeTemp == GlobalContext.String) { var valueS = new LocalCil($"_value{init.LocalCils.Count}"); init.LocalCils.Add(valueS); var stringCool = ""; var varDataString = new VarCil($"s{CilAst.dataStringCils.Count}"); CilAst.dataStringCils.Add(new DataStringCil(varDataString, new StringCil(stringCool))); init.ThreeDirInses.Add(new LoadCil(valueS, varDataString)); init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), valueS)); } else if (attributeTemp.Type == GlobalContext.String) { init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), CreateABasicType(init, CilAst.String))); } else if (attributeTemp.Type == GlobalContext.Int) { init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), CreateABasicType(init, CilAst.Int))); } else if (attributeTemp.Type == GlobalContext.Bool) { init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), CreateABasicType(init, CilAst.Bool))); } else { init.ThreeDirInses.Add(new SetAttrCil(value, typeCilNew.GetAttributeCilsByCoolName(attributeTemp.ID), Visit_void(init))); } } } } init.ThreeDirInses.Add(new ReturnCil(value)); }