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(FormalContext parserRule, IFunctionCil cilTree, IContextCil contextCil) { contextCil.Define(parserRule.idText); var arg = new ArgCil(contextCil.variables[parserRule.idText].Name); cilTree.ArgCils.Add(arg); }