> - Defining an environment that sets up active characters to emulate
>   traditional BNF syntax is very concise, but comes at the cost of
>   delimited arguments and catcode madness.

You could as well use a letter-by-letter parser that doesn't need altered
category codes. Take a look at the pgf module `parser`. That's not `expl3`
but could give you an idea on what's possible.