Для написания интерпретатора очень важно понять самый главный принцип:
интерпретация структур данных
Программа представляется в виде структуры данных, чаще всего это дерево (или граф) объектов, в каждом узле находится объект, представляющий различные элементы языка: константа, функция, цикл и т.п.
Каждый элемент обязательно должен иметь возможность содержать в себе
(а) элементы адресуемые по имени (ассоцифтивный массив) и
(б) вложенные элементы причем в контролируемом порядке (массив или список).
Интерпретатор бегает по дереву/графу программы, и выполняет действия через вызовы методом объектов.
Например у
class Operator -> Plus
задается метод
add() { return nest[0].add( nest[1] }
nest это список вложенных элементов (операнды)
Некоторые объекты умеют создавать новые исполняемые структуры данных в памяти интерпретатора, реализация и хранение переменных делается через атрибуты любого объекта (ассойиативный массив), например объект global хранит в своих атрибутах глобальные переменные.
кое-что есть здесь в глубокой преальфе (интерпретатор на питоне)
https://github.com/ponyatov/hico/releases/latest