Compilers: Principles, Techniques and Tools