Главная arrow Программирование С++ arrow Выполнение оператора if

Выполнение оператора if

Теперь, когда базовая структура интерпретатора 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 заключен в блоки. Как объяснялось, для упрощения интерпретатора все формирующие результат части управляющих операторов должны содержаться в блоках. Это ограничение делает код интерпретатора более простым.