This project shows an example of a compiler pipeline.
The frontend is responsible for parsing the input file (example.lang) and returning an AST. The AST is designed using an OO approach, with two main types (Statement and Expression), and multiple options for each. A program is a list of statements. There is one semantic validation: we are detecting if variables are used before they are defined. If so, we raise an exception.