A practice of compiler design.