@shibao i struggle bussed parsing until PEG. the ford paper on pegs is pretty readable, but people also just don't feel a need to be insufferable about them. ross cox has some papers on regular expressions. (PEGs are just regex that aren't shit; there's also rosie patterns that tried to basically turn LPeg in to a nice library you could just import and use.)
recursive descent parsers are basically PEGs, also, but over tokens. cordy's S/SL is a nice paper on that, since S/SL is basically just a shorthand over reading a symbol and running switch() over them.
the worst of it all is people can't stop writing encrypted academia prose about ANY of it. so trying to look up what LL(1) means will just give you knuth's extended fanfiction about breast inflation and table theory, but its actually just an NFA about "read some symbols and switch on the result," and NFAs are actually not scary (its a graph. be in some state, state has a list of transitions and conditions, check which one applies, go.) there's always blither about "DFA minimization" but you probably don't need to do this. DFA shit is just about trying to migrate out the cost of an NFA making those decisions, but in cases like LLVM this is moronic because they end up putting a 100+mb fucking table in a C file just to escape having to do a little bit of dispatch.
so basically read about pegs and then pratt parsers, maybe cordy's s/sl paper (its short) and that's going to cover most of the dragon books bullshitting about lex/yacc.
term rewriting is the biggest part (this is often given extremely intractible encrypted descriptions like "redexes" and racket has a "redex" package which was written like the author was being given grants by the word. refal's book is old and weird but it explains the concept extremely simply: look for pattern in a book, if it matches then replace with a result. ocaml matching pretty similar.
for a modern compiler you also have to worry about static single assignment form (basically rewrites a program such that every x = y becomes x_counter = y, and anywhere that its ambiguous gets replaced with x_counter = cope, but they prefer to call them "phi functions.")
registerization is cursed and sucks.
lex, parse, term-rewrite, ssa and registerize are basically the whole game though. other specific passes are "it depends,"