If C++ is an option, you may be interested in the spirit library (now part of boost). It allows you to code a parser in syntax very close to EBNF--it can be very nice to use.