예제 #1
0
        public void ProcessStatementForStandard(DMASTProcStatementForStandard statementForStandard)
        {
            _proc.StartScope();
            {
                if (statementForStandard.Initializer != null)
                {
                    ProcessStatement(statementForStandard.Initializer);
                }

                string loopLabel = _proc.NewLabelName();
                _proc.LoopStart(loopLabel);
                {
                    DMExpression.Emit(_dmObject, _proc, statementForStandard.Comparator);
                    _proc.BreakIfFalse();

                    ProcessBlockInner(statementForStandard.Body);

                    _proc.LoopContinue(loopLabel);
                    if (statementForStandard.Incrementor != null)
                    {
                        DMExpression.Emit(_dmObject, _proc, statementForStandard.Incrementor);
                        _proc.Pop();
                    }
                    _proc.LoopJumpToStart(loopLabel);
                }
                _proc.LoopEnd();
            }
            _proc.EndScope();
        }
예제 #2
0
 public void VisitProcStatementForStandard(DMASTProcStatementForStandard statementForStandard)
 {
     statementForStandard.Initializer?.Visit(this);
     if (statementForStandard.Comparator != null)
     {
         SimplifyExpression(ref statementForStandard.Comparator);
     }
     if (statementForStandard.Incrementor != null)
     {
         SimplifyExpression(ref statementForStandard.Incrementor);
     }
     statementForStandard.Body?.Visit(this);
 }