# Intermediate code generation - Put symbol table in the reader monad and it to the stack or use the state monad for everything. - Add errors handling to the monad stack. # ELF generation - Don't ignore relocations where the symbol is not defined in the symbol table. Report an error about an undefined symbol. - Don't hardcode symbols in symbolEntry. # Name analysis - Format error messages. - Name analyzer collects procedure names in the first run. Implement the second run, where the analyzer goes into and checks procedures.