Теперь, когда базовая структура интерпретатора Mini С++ описана, самое время познакомиться с реализацией управляющих операторов. Вообще, каждый раз, когда обнаружено ключевое слово, функция interp о вызывает функцию, обрабатывающую обнаруженный оператор. Имена всех функций, интерпретирующих различные управляющие операторы, начинаются с префикса ехес_. Например, цикл for интерпретируется функцией exec_for(), а оператор switch — функцией exec_switch() и т. д. Один из легчайших операторов для интерпретации — оператор if. Он обрабатывается функцией exec_if о, приведенной далее. // Выполняет оператор if. void exec_if() { int cond; eval_exp(cond); // получает выражение оператора if. if(cond) { // если true, обрабатывает блок в составе IF // Подтверждает начало блока. if(*token != '{') throw InterpExc(BRACE_EXPECTED); interp(); ) else { // В противном случае пропускает блок IF и // обрабатывает ELSE, если он есть. find_eob(); // находит начало следующей строки get_token(); if(tok != ELSE) { // Возвращает лексему, если нет ELSE. putback(); return; ) // Подтверждает начало блока. get_token(); if(*token != ¦{') throw InterpExc(BRACE_EXPECTED); putback(); interp(); ) } Давайте рассмотрим внимательно действие этой функции. Сначала функция exec_if о вызывает функцию eval_exp() для вычисления значения условного выражения. Если оно равно true (ненулевое), вызывается функция interpo, которая выполняет код блока оператора if. Если условное выражение равно false, вызывается функция find_eob(), которая продвигает указатель программы в точку, расположенную сразу после блока if. Если есть ветка else, выполняется связанный с ней блок кода. В противном случае выполнение начинается со следующей строки кода. Если выполняется блок if и в программе есть блок else, должен быть способ обхода блока else. Это действие выполняется в функции interpo, когда встречается оператор else. В этом случае функция interp о просто вызывает фуНКЦИЮ find_eob() ДЛЯ обхода блока else. ПоМНИТе, ЧТО блок else будет обрабатываться функцией interp о (в синтаксически корректной программе) только после того, как выполнен блок if. Еще одно замечание: обратите внимание на то, что функция exec_if о проверяет, что формирующий результат код ветвей if и else заключен в блоки. Как объяснялось, для упрощения интерпретатора все формирующие результат части управляющих операторов должны содержаться в блоках. Это ограничение делает код интерпретатора более простым.
|