A practical approach to compiler construction. (2017)