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