grammar : rule (rule-separator rule)* rule : non-terminal separator ':' separator expression rule-separator : \x0A \x0A+ separator : (\x09 | \x20)+ | \x0A (\x09 | \x20)* non-terminal : ([A-Z] | [a-z] | [-_]) ([0-9] | [A-Z] | [a-z] | [-_])* expression : layer-0 | layer-1 | layer-2 layer-0 : terminal | non-terminal layer-1 : optional | repetition | free-monoid layer-2 : alternation | concatenation | exception terminal : string | hex-literal | character-set | extension optional : layer-0 '?' | '(' (layer-1 | layer-2) ')' '?' repetition : layer-0 '+' | '(' (layer-1 | layer-2) ')' '+' free-monoid : layer-0 '*' | '(' (layer-1 | layer-2) ')' '*' alternation : alt-operand separator '|' separator alt-operand concatenation : con-operand ' ' con-operand exception : exc-operand ' - ' exc-operand alt-operand : layer-0 | layer-1 | '(' layer-2 ')' | alternation | concatenation con-operand : layer-0 | layer-1 | '(' layer-2 ')' | concatenation exc-operand : layer-0 | layer-1 | '(' layer-2 ')' string : "'" (anything - "'")* "'" | '"' (anything - '"')* '"' hex-literal : '\x' ([0-9] | [A-F])+ character-set : '[' (character-list | character-range | extension) ']' character-list : anything+ | hex-literal+ character-range : anything '-' anything | hex-literal '-' hex-literal extension : '<' anything+ '>' anything : [<all valid UTF-8 characters>]