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>]