Compilers: Principles, Techniques, and Tools