1. Read and write grammars for programming language constructs
2. Perform lexical analysis and use lexical analyzer generators
3. Perform top-down parsing, bottom-up parsing and use parser generators
4. Perform semantic analysis including static checking, intermediate representstions and attribute grammars
5. Create symbol tables
6. Perform run-time analysis
7. Perform code generation
8. Perform optimizations
9. Implement the phases of a compiler for a small recursive language