use recursion:
condition --> [X], ( condition_separator, condition ; [] ).
condition_separator could be empty, then omit it
edit
To generate the syntax tree, the easiest way it's to add arguments to productions, reproducing the 'shape' (untested code):
selection(Tree) -->
[if,'('], condition(Condition1), [')', then,'{'], commands(Commands1), ['}'],
{Tree = selection(Condition1, Commands1)}
;
[if,'('],condition(Condition1),[')', then,'{'], commands(Commands1),
['}', else,'{'], commands(Commands2),['}'],
{Tree = selection(Condition1, Commands1, Commands2)}
.
condition(X)-->[X].
commands(X)-->[X].
then when visiting the tree use the different arity (arguments count) of selection to recover the parsed branch.
Let's say we have command list where each command is terminated by ';': that could be
commands([C|Cs]) --> command(C), [';'], commands(Cs).
commands([]) --> [].