regex := alternate (PIPE alternate)* alternate := node* node := csetnode | grouping csetnode := TILDE? (CHARSET | union) STAR? union := LEFT_BRACKET CHARSET* RIGHT_BRACKET grouping := LEFT_PAREN regex RIGHT_PAREN