exp = group | or_exp ;

group = '(', or_exp, ')' ;

or_exp = and_exp, { or_delim, and_exp } ;

or_delim = '|' | ';' ;

and_exp = (function | group | and_strict), { ',', (function | group | and_strict) } ;

function = identifier, '(', [arg, { ',', arg }], ')' ;

and_strict = (function | group), { '&', (function | group) } ;

identifier = /[a-z]+/

arg = and_exp | arg_array | value ;

value = /[_0-9a-zA-Z]+/ ;

arg_array = '(', value, { ',', value }, ')' ;