Compiler Design Fundamentals