Выразительный JavaScript.

Интерпретатор.

А что нам делать с синтаксическим деревом программы? Запускать её! Этим занимается интерпретатор. Вы даёте ему синтаксическое дерево и объект окружения, который связывает имена со значениями, а он интерпретирует выражение, представляемое деревом, и возвращает результат.

Function evaluate(expr, env) {

Switch(expr.type) {

Case "value":

Return expr.value;

Case "word":

If (expr.name in env).

Return env[expr.name];

Else.

Throw new ReferenceError("Неопределённая переменная: "

Expr.name);

Case "apply":

If (expr.operator.type == "word" &&

Expr.operator.name in specialForms).

Return specialForms[expr.operator.name](expr.args,

Env);

Var op = evaluate(expr.operator, env);

If (typeof op != "function").

Throw new TypeError("Приложение не является функцией.");

Return op.apply(null, expr.args.map(function(arg) {

Return evaluate(arg, env);

}));

}

}

Var specialForms = Object.create(null);

У интерпретатора есть код для каждого из типов выражений. Для литералов он возвращает их значение. Например, выражение 100 интерпретируется в число 100. У переменной мы должны проверить, определена ли она в окружении, и если да – запросить её значение.

С приложениями сложнее. Если это особая форма типа if, мы ничего не интерпретируем, а просто передаём аргументы вместе с окружением в функцию, обрабатывающую форму. Если это простой вызов, мы интерпретируем оператор, проверяем, что это функция и вызываем его с результатом интерпретации аргументов.

Для представления значений функций Egg мы будем использовать простые значения функций JavaScript. Мы вернёмся к этому позже, когда определим специальную форму fun.

Рекурсивная структура интерпретатора напоминает парсер. Оба отражают структуру языка. Можно было бы интегрировать парсер в интерпретатор и интерпретировать во время разбора, но их разделение делает программу более читаемой.

Вот и всё, что нужно для интерпретации Egg. Вот так просто. Но без определения нескольких специальных форм и добавления полезных значений в окружение, вы с этим языком ничего не сможете сделать.