/// <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); } }
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); } }