private void AttachToStack(Stack <IContextExpression> stack, IContextExpression newNode) { if (stack.Any()) { var parent = stack.Pop(); if (parent is ParentExpression) { if ((parent as ParentExpression).Child != null) { throw new ExpressionParseException(string.Format( "Parent for {0} already full.", newNode.GetType().Name)); } (parent as ParentExpression).Child = newNode; AttachToStack(stack, parent); } if (parent is NodeExpression) { if ((parent as NodeExpression).RightChild != null) { throw new ExpressionParseException(string.Format( "Parent for {0} already full.", newNode.GetType().Name)); } (parent as NodeExpression).RightChild = newNode; AttachToStack(stack, parent); } } else { stack.Push(newNode); } }