My antlr syntax is a bit rusty but you should try something like this:
forall
:'forall' '('rule1')' '[' ('(' rule2 ')' ('|' '(' rule2 ')' )* )? ']'
;
That is, instead of (r|)*
write (r(|r)*)?
. You can see how the latter allows for zero, one or many rules with pipes inbetween.