If you look at how compilers are written these days, one other thing has changed. Almost every book on compiler design, including the classics, will direct you towards separating the lexer, scanner and compiler stages using parser generators like Lex&#x2F;Yacc or Flex&#x2F;Bison. In practice, this isn&#x27;t done anymore. If you look at modern compilers like Clang, Go or Rust, they all have hand-coded parsers that build syntax trees right out of tokens. It turns out that parser generators don&#x27;t really give you that much, and only get in the way once you need to go beyond the basics.