A Practical Approach to Compiler Construction