The code follows the 2003 tutorial by Daniel P. Friedman and Anurag Mendhekar on Using an Abstracted Interpreter to Understand Abstract Interpretation (PDF).
A 2017 paper following a similar but more principled approach is Abstracting Definitional Interpreters by Darais et al. (PDF, code).