COOL interpreter with type inference functionality. I used a mixture of top-bottom and bottom-up approach.