Exemplo n.º 1
0
        internal override void ResolveVariableOrigins(ParserContext parser, VariableScope varIds, VariableIdAllocPhase phase)
        {
            this.IterationExpression.ResolveVariableOrigins(parser, varIds, phase);

            if ((phase & VariableIdAllocPhase.REGISTER) != 0)
            {
                varIds.RegisterVariable(this.IterationType, this.IterationVariable.Value);
                this.IndexLocalId = varIds.RegisterSyntheticVariable(AType.Integer(this.FirstToken));
                this.ListLocalId  = varIds.RegisterSyntheticVariable(AType.Any(this.FirstToken));
            }

            if (phase != VariableIdAllocPhase.REGISTER_AND_ALLOC)
            {
                foreach (Executable ex in this.Code)
                {
                    ex.ResolveVariableOrigins(parser, varIds, phase);
                }
            }
            else
            {
                foreach (Executable ex in this.Code)
                {
                    ex.ResolveVariableOrigins(parser, varIds, VariableIdAllocPhase.REGISTER);
                }

                foreach (Executable ex in this.Code)
                {
                    ex.ResolveVariableOrigins(parser, varIds, VariableIdAllocPhase.ALLOC);
                }
            }

            this.IterationVariableId = varIds.GetVarId(this.IterationVariable);
        }
Exemplo n.º 2
0
        internal override Expression Resolve(ParserContext parser)
        {
            for (int i = 0; i < this.Args.Length; ++i)
            {
                this.Args[i] = this.Args[i].Resolve(parser);
            }

            this.Root = this.Root.Resolve(parser);

            // TODO: this is hardcoded just for Math.floor(numeric constant). Eventually, it'd be nice
            // for a few common functions to have a compile-time codepath here.
            // e.g. Core.parseInt, Math.sin, etc.
            if (this.Root is FunctionReference)
            {
                FunctionDefinition funcDef = ((FunctionReference)this.Root).FunctionDefinition;
                IConstantValue     cv      = this.SimplifyFunctionCall(funcDef, this.Args);
                if (cv != null)
                {
                    return((Expression)cv);
                }
            }

            if (this.Root is SpecialEntity)
            {
                if (this.Root is SpecialEntity.EnumMaxFunction)
                {
                    int max = ((SpecialEntity.EnumMaxFunction) this.Root).GetMax();
                    return(new IntegerConstant(this.Root.FirstToken, max, this.Owner));
                }

                if (this.Root is SpecialEntity.EnumValuesFunction)
                {
                    int[]             rawValues = ((SpecialEntity.EnumValuesFunction) this.Root).GetValues();
                    List <Expression> values    = new List <Expression>();
                    foreach (int rawValue in rawValues)
                    {
                        values.Add(new IntegerConstant(this.Root.FirstToken, rawValue, this.Owner));
                    }
                    return(new ListDefinition(this.FirstToken, values, AType.Integer(this.FirstToken), this.Owner, false, null));
                }
            }

            return(this);
        }