rules: rule+ rule: (IDENT ':' alts NEWLINE) | NEWLINE alts: item ('|' item)* item: optional | kleene optional: '[' alts ']' kleene: element | element '*' | element '+' element: group | IDENT | STRING group: '(' alts ')'