Introduction to the Theory of Programming Languages by Bertrand Meyer — free book covering formal foundations of programming languages https://bertrandmeyer.com/itpl/