There's a bit of a problem in the combinator-based UPARSE with the historical convention of an INTEGER! rule, where if you have two integers in a row it indicates a range of how many things to accept.
rebol2> parse "**" [1 2 "*"] ; between 1 and 2 stars
== true
rebol2> parse "**" [3 4 "*"] ; between 3 and 4 stars
== false
It doesn't fit into the "natural" pattern of combinators, e.g. where 1 2 RULE is the same as 1 [2 RULE].
That doesn't mean it can't be done...it just means it would have to be part of the BLOCK! combinator specifically to notice integer sequences (vs dispatching to some generic INTEGER! combinator)
I've only used the range-of-times check fairly rarely, myself. So I wonder how much worse it would be to use TALLY. So instead of min max rule you could say:
let n: tally rule, :(all [n >= min, n <= max])
This gives you more freedom in expressing the bounds, while not being optimized for the specific case. It also means that if N is much greater than max, you'll waste time running rule you wouldn't have to.
But, the Bigger Question...
How good an idea it is to have something that acts as a keyword be abstractable? I've often been confused when I see something like:
parse ... [... something rule ...]
And SOMETHING is actually an integer. It isn't a rule in its own right, it's picking up the next rule...like a keyword.
As a reader, I feel like a keyword like REPEAT is missing here. I don't know how much we want to stick to the rule that every word resolve to a parse rule...if we did, then you'd have to escape out of that with the likes of:
parse ... [... repeat (2) rule ...]
parse ... [... repeat (something + 1) rule ...]
But perhaps within PARSE, literal integers could be exempted...assumed to never match integers, but be passed as a parameter.
This doesn't answer what to do about ranges of integers (and BETWEEN is taken). But just pointing out that I don't know that the current super-succinct integer syntax pays off all that well. It might be better to be a little more verbose to make it clear that a repetition is happening.