Compilers: Principles, techniques, & tools