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