In "Choice", add $ret = "(?:".$ret.")"; after the join. When combining a Choice with other values, the Choice values need to be separated from the other ones, because precedence for | is low.
In "Repetition", there must not be space between the min and max values:
$ret .= " (?: ". Value($$v{value} , $dent+1)." ){$$v{min},$$v{max}} ";