Esempio n. 1
0
        public override INode DoResolve(ResolveContext rc)
        {
            Label lb = rc.DefineLabel(LabelType.IF);

            ExitIf         = rc.DefineLabel(lb.Name + "_EXIT");
            Else           = rc.DefineLabel(lb.Name + "_ELSE");
            ParentIf       = rc.EnclosingIf;
            rc.EnclosingIf = this;


            rc.CreateNewState();
            rc.CurrentGlobalScope |= ResolveScopes.If;

            // enter if
            Expression     = (Expression)Expression.DoResolve(rc);
            TrueStatement  = (Statement)TrueStatement.DoResolve(rc);
            FalseStatement = (Statement)FalseStatement.DoResolve(rc);

            if (Expression.IsVoid)
            {
                ResolveContext.Report.Error(3, Location, "cannot evaluate void type in if statement");
            }

            rc.RestoreOldState();
            // exit current if
            rc.EnclosingIf = ParentIf;


            return(base.DoResolve(rc));
        }
Esempio n. 2
0
        public override INode DoResolve(ResolveContext rc)
        {
            rc.CreateNewState();
            rc.CurrentGlobalScope |= ResolveScopes.Loop;
            Label lb = rc.DefineLabel(LabelType.WHILE);

            ExitLoop      = rc.DefineLabel(lb.Name + "_EXIT");
            LoopCondition = rc.DefineLabel(lb.Name + "_COND");
            EnterLoop     = rc.DefineLabel(lb.Name + "_ENTER");
            ParentLoop    = rc.EnclosingLoop;
            // enter loop


            Expression = (Expression)Expression.DoResolve(rc);
            Statement  = (Statement)Statement.DoResolve(rc);


            if (Expression.IsVoid)
            {
                ResolveContext.Report.Error(104, Location, "cannot evaluate void type in while statement");
            }


            if (Expression is IntegralExpression && (Expression as IntegralExpression).Value != 0)
            {
                ResolveContext.Report.Warning(Location, "Infinite loop");
            }
            rc.RestoreOldState();
            // exit current loop
            rc.EnclosingLoop = ParentLoop;

            return(base.DoResolve(rc));
        }