To write EBNF like grammars you can use
Parse::Eyapp
(see
Parse::Eyapp::languageintro) or
Parse::RecDescent. If BNF is enough
Parse::Yapp is a good option. Both
Parse::Eyapp and
Parse::Yapp
very much work like yacc/bison and all the theory/documentation about yacc/bison applies to them.
Casiano