Example #1
0
        /// <summary>
        /// Builds if statement
        /// </summary>
        /// <param name="ifNode">If statement node</param>
        private void BuildIfStatement(ASTIfStatementNode ifNode)
        {
            //define labels
            var elseBody = _emitter.DefineLabel();
            var exitIf   = _emitter.DefineLabel();

            //calc condition
            BuildExpression(ifNode.Condition);
            if (_emitter.StackPeek() != typeof(bool))
            {
                _emitter.ToBool();
            }
            //check
            _emitter.JumpFalse(elseBody);
            //body
            if (ifNode.TrueBody != null)
            {
                BuildStatement(ifNode.TrueBody);
                _emitter.Jump(exitIf);
            }
            //else body
            _emitter.MarkLabel(elseBody);
            if (ifNode.ElseBody != null)
            {
                BuildStatement(ifNode.ElseBody);
            }
            //exit
            _emitter.MarkLabel(exitIf);
        }
 private void VisitIfStatement(ASTIfStatementNode ifNode)
 {
     if (ifNode.TrueBody != null)
     {
         VisitBodyStatement(ifNode.TrueBody);
     }
     if (ifNode.ElseBody != null)
     {
         VisitBodyStatement(ifNode.ElseBody);
     }
 }
Example #3
0
 private void CheckIfStatement(ASTIfStatementNode ifNode)
 {
     CheckExpression(ifNode.Condition);
     CheckImplicitCast(ifNode.Condition, typeof(bool));
     //TODO: сначала высчитывать условие а потом смотреть тела
     if (ASTExprHelper.IsValuable(ifNode.Condition))
     {
         var isTrue = Convert.ToBoolean(ASTExprHelper.GetValue(ifNode.Condition));
         //permanetnly true
         if (isTrue)
         {
             if (ifNode.TrueBody != null)
             {
                 _messages.Add(new MessageRecord(
                                   MsgCode.PermanentlyExecution,
                                   ifNode.TrueBody.SourcePath,
                                   ifNode.TrueBody.StartLine,
                                   ifNode.TrueBody.StartPos
                                   ));
             }
             if (ifNode.ElseBody != null)
             {
                 _messages.Add(new MessageRecord(
                                   MsgCode.UnreachableCode,
                                   ifNode.ElseBody.SourcePath,
                                   ifNode.ElseBody.StartLine,
                                   ifNode.ElseBody.StartPos
                                   ));
             }
         }
         else //permanently false
         {
             if (ifNode.TrueBody != null)
             {
                 _messages.Add(new MessageRecord(
                                   MsgCode.UnreachableCode,
                                   ifNode.TrueBody.SourcePath,
                                   ifNode.TrueBody.StartLine,
                                   ifNode.TrueBody.StartPos
                                   ));
             }
             if (ifNode.ElseBody != null)
             {
                 _messages.Add(new MessageRecord(
                                   MsgCode.PermanentlyExecution,
                                   ifNode.ElseBody.SourcePath,
                                   ifNode.ElseBody.StartLine,
                                   ifNode.ElseBody.StartPos
                                   ));
             }
         }
     }
     if (ifNode.TrueBody != null)
     {
         CheckBody(ifNode.TrueBody);
     }
     if (ifNode.ElseBody != null)
     {
         CheckBody(ifNode.ElseBody);
     }
 }