public static MyError BadProcedureError(PyObj pyObj, ProcedureSegment procedureSegment) { return(new MyError(String.Format("La funcion o metodo: {0} con: {1} argumentos no es una funcion o metodo valida para el tipo: {2}", procedureSegment.Id, procedureSegment.CountArguments, TypeConstants.GetMyTypeName(pyObj.GetMyType())) )); }
public void InvokeMain() { var result = GetMember(ProcedureSegment.EmptyProcedureSegment("main", 0)); if (IsError(result)) { ErrorFactory.MainNotFound(Root.NodePath, (MyError)result); } }
//Retorna error o PyObj public Word GetMember(ProcedureSegment procedureSegment) { if (Visitor == null) { throw new Exception("Tiene que inicializar visitor con InitVisitor antes de usar cualquier GetMember"); } var result = Visitor.InvokeProcedure(procedureSegment); var firstResult = result; if (!IsError(result)) { return(result); } foreach (var import in Imports) { result = import.GetMember(procedureSegment); if (!IsError(result)) { return(result); } } return(firstResult); }
public Word InvokeProcedure(ProcedureSegment procedureSegment) { var name = procedureSegment.Id; name = name.ToLowerInvariant(); var arguments = procedureSegment.Arguments; var argumentCount = arguments.Count; Procedure procedure; Procedures.TryGetValue(Procedure.EmptySignature(name, argumentCount), out procedure); if (procedure == null) { return(new MyError("No existe una funcion con el nombre: " + name + " y numero de parametros: " + argumentCount + " en las definiciones globales")); } //scope antes de llamar a la funcion var previousScope = CurrentScope; //Pasamos al scope global para llamar a la funcion CurrentScope = GlobalScope; ControlType controlType; if (procedure.GetDefinitionType() == DefinitionType.Function) { controlType = ControlType.Function; } else if (procedure.GetDefinitionType() == DefinitionType.Method) { controlType = ControlType.Method; } else { throw new Exception("definicion no valida. tiene que ser funciton o method"); } ControlStack.Push(controlType); //hacemos las declaraciones del metodo en un nuevo scope PushScope(); Word result; for (int i = 0; i < argumentCount; i++) { result = CurrentScope.Add(procedure.ParamNames[i], arguments[i]); if (IsError(result)) { ControlStack.Pop(); CurrentScope = previousScope; return(result); } } //Los stmt del metodo: foreach (var stmt in procedure.Stmts) { result = stmt.Accept(this); if (IsJumper(result)) { var jumper = (Jumper)result; if (!jumper.WasPopped() && !ControlStack.PopUntil(jumper)) { ErrorFactory.NotValidJumper(stmt, jumper); continue; } CurrentScope = previousScope; return(((Return)jumper).Obj); } } //Si termina de visitar los stmt, no entro jumper y es una funcion retorna MyNull y reporta un error ControlStack.Pop(); CurrentScope = previousScope; if (controlType == ControlType.Method) { return(null); } else { ErrorFactory.NoValueReturnedInFunction(procedure.Stmts.Last()); return(MyNull.GetInstance()); } }