The Art of Compiler Design: Theory and Practice