These days the general consensus is to use the Pratt parser, which is somewhat harder to understand, but ends up not too hard to build and integrate into a recursive decent parser, and is supereasy to modify.
Here's one popular explanation:
https://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-...
What I find funny is that Pratt's parser was never really a theoretical result and was never properly covered in popular compiler textbook.