Derivation of a Typed Functional LR Parser
fast parser combinators https://github.com/AndrasKovacs/flatparse
seems to be inspired by https://github.com/Geal/nom
The Dragon Book has a remarkably good chapter on parsing.
Taking a union of two grammars and disambiguating later (à la DisambECP in GHC) is probably way more efficient than backtracking.
Divide and conquer: instead of trying to parse left-to-right, split the input using certain landmarks (e.g. \n\n separating declarations) and process each block individually (perhaps even in parallel).