If you have a grammar for your BNF rules, you could use Parse::RecDescent to parse the BNF rules for you. Decide on a 'nice structure' that you would like to compile the BNF rules into, and write Parse::RecDescent rules to create that structure as Parse::RecDescent parses your BNF rules.