public void Visit_Runtime_Error(IFunctionCil cilTree, string sms) { var varStr = new LocalCil($"_value{cilTree.LocalCils.Count}"); cilTree.LocalCils.Add(varStr); var varDataString = new VarCil($"s{CilAst.dataStringCils.Count}"); CilAst.dataStringCils.Add(new DataStringCil(varDataString, new StringCil(sms))); cilTree.ThreeDirInses.Add(new LoadCil(varStr, varDataString)); cilTree.ThreeDirInses.Add(new Out_strCil(varStr)); cilTree.ThreeDirInses.Add(new Halt()); }
public IHolderCil Visit(StringExprContext parserRule, IFunctionCil cilTree, IContextCil contextCil) { var value = new LocalCil($"_value{cilTree.LocalCils.Count}"); cilTree.LocalCils.Add(value); var stringCool = parserRule.STRING().GetText(); var varDataString = new VarCil($"s{CilAst.dataStringCils.Count}"); CilAst.dataStringCils.Add(new DataStringCil(varDataString, new StringCil(stringCool))); cilTree.ThreeDirInses.Add(new LoadCil(value, varDataString)); return(CreateABasicTypeWhitVal(cilTree, CilAst.String, value)); }
public void Visit_Runtime_Error_whit_Cond(IHolderCil valueCond, IFunctionCil cilTree, string sms) { var Continue = cilTree.CreateLabel($"Continue_"); cilTree.ThreeDirInses.Add(new IfGoto(valueCond, Continue)); var varStr = new LocalCil($"_value{cilTree.LocalCils.Count}"); cilTree.LocalCils.Add(varStr); var varDataString = new VarCil($"s{CilAst.dataStringCils.Count}"); CilAst.dataStringCils.Add(new DataStringCil(varDataString, new StringCil(sms))); cilTree.ThreeDirInses.Add(new LoadCil(varStr, varDataString)); cilTree.ThreeDirInses.Add(new Out_strCil(varStr)); cilTree.ThreeDirInses.Add(new Halt()); cilTree.ThreeDirInses.Add(new Label(Continue)); }
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)); }