Example #1
0
 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);
        }
Example #4
0
        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());
            }
        }