See: http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools