IMNSHO we should be aware of "big hammer" solutions but not be afraid to pick concrete representations when they make things easy on the machine. (in particular, tests using the former are wonderful double checks for deployment candidates using the latter)
[when would specifying an unambiguous grammar be premature optimisation? when changing the language later is cheap (unlikely!), or when the strings in that language are always going to be of size <= k. Nerd snipe: what —to order of magnitude— is k ca. 2023?]
Parser combinators have become my preferred "medium hammer" strategy:
Sometimes you get a more readable parser than if you use regex, even though your language is regular.
Sometimes you get corner cases where you have to think and an LR parser generator wouldn't require thinking.
On the other hand, you have one tool that almost always does the job well, is readable, and embeds nicely.
1: https://people.eecs.berkeley.edu/~necula/Papers/elkhound_cc0...