Depending on how much common processing you do on the files, I might lean towards a parser combinator library. If you use a parser generator, you'll probably have a separate grammar file for each file format. It might be difficult making things overlap when you want them too (if two formats have a similar structure that you want to represent with the same AST), and maybe you'd have the reverse problem of conflicts, where some AST node has the same name but different structure in two grammars. I think with the parser combinator, you would be able to share common elements across different parsers and have better control over the AST you generate.
I should add a disclaimer that over the past decade when faced with needing a parser, I have more often coded something by hand or used a parser generator. The only time I remember using a combinator library was parsing the select queries when NashFP was doing the rdbms project.
Mark