P::RD (Parse::RecDescent) uses BNF to parse text. It doesn't parse BNF. If I understood the OP correctly, he wants to parse the BNF notation itself, i.e. given a file with a BNF description, create a parse tree from it.
I recommend the second technique, because it's (1) very simple, the BNF notation is trivial. (2) Will let one understand BNF as the rule descriptions of P::RD are written in it.