Ejemplo n.º 1
0
        public override bool VisitForExpression(ForExpressionAST forExpressionAst)
        {
            var other = _other as ForExpressionAST;

            if (other == null)
            {
                return(false);
            }

            return(other.VarId == forExpressionAst.VarId &&
                   IsEqualNodes(other.ExpressionTo, forExpressionAst.ExpressionTo) &&
                   IsEqualNodes(other.ExpressionFrom, forExpressionAst.ExpressionFrom) &&
                   IsEqualNodes(other.BodyExpressions, forExpressionAst.BodyExpressions));
        }
Ejemplo n.º 2
0
        public override bool VisitForExpression(ForExpressionAST forExpression)
        {
            forExpression.ExpressionFrom.Accept(this);
            forExpression.ReturnType = TigerType.GetType <ErrorType>();
            //si la expresion "from" no es de tipo entero.
            if (forExpression.ExpressionFrom.ReturnType != TigerType.GetType <IntType>())
            {
                _errorListener.Add(new AnalysisError(string.Format(AnalysisError.LoadMessage("ForInit"), forExpression.VarId), forExpression.Line,
                                                     forExpression.Columns));
            }
            else
            {
                forExpression.ExpressionTo.Accept(this);
                // si la expresion "to" no es tipo entero.
                if (forExpression.ExpressionTo.ReturnType != TigerType.GetType <IntType>())
                {
                    _errorListener.Add(new AnalysisError(string.Format(AnalysisError.LoadMessage("ForStop"), forExpression.VarId),
                                                         forExpression.Line, forExpression.Columns));
                }
                else
                {
                    var sc = new Scope(_scope, forExpression);
                    forExpression.CurrentScope = sc;
                    if (_scope.HasVar(forExpression.VarId) != ScopeLocation.NotDeclared)
                    {
                        _errorListener.Add(new AnalysisError(string.Format(AnalysisError.LoadMessage("VarDecl"), forExpression.VarId),
                                                             forExpression.Line, forExpression.Columns));
                        forExpression.ReturnType = TigerType.GetType <ErrorType>();
                        return(false);
                    }
                    //annado la variable al scope
                    sc.AddVarFor(forExpression.VarId, TigerType.Int);

                    if (forExpression.BodyExpressions.Accept(this))
                    {
                        forExpression.ReturnType = forExpression.BodyExpressions.ReturnType;
                        return(true);
                    }
                }
            }
            return(false);
        }
Ejemplo n.º 3
0
 public abstract T VisitForExpression(ForExpressionAST forExpressionAst);
Ejemplo n.º 4
0
        public override Unit VisitForExpression(ForExpressionAST forExpression)
        {
            //--->
            bool pushOnStack = code.PushOnStack;

            ILGenerator il = code.Method.GetILGenerator();


            //crear la variable del for.
            LocalBuilder varFor      = il.DeclareLocal(typeof(int));
            string       varCodeName = forExpression.CurrentScope.GetVarNameCode(forExpression.VarId);

            code.DefinedLocal.Add(varCodeName, varFor);

            code.PushOnStack = true;
            forExpression.ExpressionFrom.Accept(this);
            il.Emit(OpCodes.Stloc, varFor.LocalIndex);

            //declarar un variable que es el resultado del for
            LocalBuilder result = null;

            if (!(forExpression.BodyExpressions.ReturnType is NoType))
            {
                string typeCodeName = forExpression.CurrentScope.GetTypeInfo(forExpression.BodyExpressions.ReturnType.TypeID).CodeName;
                result = il.DeclareLocal(code.DefinedType[typeCodeName]);
            }

            //declaracion de las etiquetas de salto
            Label evaluarCond = il.DefineLabel();

            //--->
            Label loopAboveEnd = code.EndCurrentLoop;

            code.EndCurrentLoop = il.DefineLabel();

            //condicion
            il.MarkLabel(evaluarCond);
            //cargas la i
            code.PushOnStack = true;
            il.Emit(OpCodes.Ldloc, varFor.LocalIndex);
            //carga la expresion from
            code.PushOnStack = true;
            forExpression.ExpressionTo.Accept(this);
            // tengo que ver si i<=exp ,pero lo que hago es !(i>exp)
            il.Emit(OpCodes.Cgt);

            //salto al final si no se cumplio la condicion
            il.Emit(OpCodes.Brtrue, code.EndCurrentLoop);

            //body
            code.PushOnStack = pushOnStack;
            forExpression.BodyExpressions.Accept(this);

            if (!(forExpression.BodyExpressions.ReturnType is NoType) && pushOnStack)
            {
                il.Emit(OpCodes.Stloc, result.LocalIndex);
            }

            //incrementar el valor de la variable de iteracion
            il.Emit(OpCodes.Ldloc, varFor.LocalIndex);
            il.Emit(OpCodes.Ldc_I4, 1);
            il.Emit(OpCodes.Add);
            il.Emit(OpCodes.Stloc, varFor.LocalIndex);
            //salta a la condicion
            il.Emit(OpCodes.Br, evaluarCond);
            //lo que viene detras del ciclo.

            il.MarkLabel(code.EndCurrentLoop);
            //<--- reponiendo la marca del posible ciclo sobre mi.
            code.EndCurrentLoop = loopAboveEnd;

            if (!(forExpression.BodyExpressions.ReturnType is NoType) && pushOnStack)
            {
                il.Emit(OpCodes.Ldloc, result.LocalIndex);
            }

            //<---
            code.PushOnStack = pushOnStack;

            return(Unit.Create());
        }