I have already implemented such a model with an ordered parameter in my package BayesianFROC in which the lower limit was only considered. However, in your case, there is, in addition, an upper limit.

Consider the model f(y|\theta) where y is a dataset and \theta is a vector of model parameter, namely \theta = (\theta_1, \theta_2, \theta_3) \in \mathbb{R}^3. (In what follows, we only consider the parameter length 3 for simplicity.)

We assume that the restriction a<\theta_1< \theta_2 <\theta_3<b where a and b are fixed numbers, and each pamaeter \theta_i has flat a prior.

To accomplish this restriction , we introduce new parameters as follows.

d\theta_2:= \theta_2 -\theta_1,

d\theta_3 := \theta_3 -\theta_2.

Then the desired answer is the following.

\theta_1 \sim \text{Uniform}(a,b),

d\theta_2 \sim \text{Uniform}(0, b-\theta_1),

d\theta_3 \sim \text{Uniform}(0, b-\theta_2),

where \text{Uniform}(a,b) denotes a flat prior whose support is the interval \{x \in \mathbb{R}; a \leq x \leq b\}.

To implement this, I have declared the parameter \theta = (\theta_1, d\theta_2,d\theta_3) in the parameter block in my Stan file. And as generated parameters, I declared \theta_2,\theta_3 in the generated parameters block in my Stan file. However, when I submitted my paper with this methods, all reviewers cannot understand this method. But, actually it runs in my package, so I believe this method goes through.

The upper bound is quite new for me, and I did not confirm this methods by running Stan. So if there is a problem, then please let me know.