Biscuit is a C++ template-based recursive-descent that combines YARD and C++ Metaprogramming finite state machine to write, in C++, reasonably readable EBNF. While I suspect not all the kinks and bugs have been flushed out, I thought the project was interesting enough to keep an eye on.
For example, following EBNF grammar fragment:
group ::= '(' expression ')'
factor ::= integer | group
term ::= factor (('*' factor) | ('/' factor))*
expression ::= term (('+' term) | ('-' term))*
is written in biscuit like this:
struct expression ; // magic!
struct group : seq< str<'('>, expression, str<')'> > { };
struct factor : or_< integer, group > { };
struct term : seq< factor, star< or_< seq< str<'*'>, factor >, seq< str<'/'>, factor > > > > { };
struct expression : seq< term, star< or_< seq< str<'+'>, term >, seq< str<'-'>, term > >
And here is a XML comment micro-parser:
typedef seq<
str<'/','*'>,
star_until< any, str<'*','/'> >
> c_comment;
which can be used like this:
if (match<c_comment>("/* hello, biscuit */")) {
//…
}
If you are not attracted to the fatal beauty of C++ template programmng, nevermind.