This project is the result of following along with Part 2 of Robert Nystrom's book, "Crafting Interpreters." The book walks through the process of designing and implementing (in Java) a programming language called Lox. I learned about and implemented the following features of programming languages: tokens and lexing, abstract syntax trees, recursive descent parsing, prefix and infix expressions, runtime representation of objects, interpreting code using the Visitor pattern, lexical scope, environment chains for storing variables, control flow, functions with parameters, closures, static variable resolution and error detection, classes, constructors, fields, methods, and inheritance.