Особенности интерпретации управляющих структур программы
Принцип интерпретации заключается в одновременном анализе и выполнении программы. При этом сама интерпретация управляющих структур программы (прежде всего, условных и циклических конструкций) должна выполняться одновременно с их синтаксическим анализом. Отсюда следует такой вывод: текст некоторой части программы просматривается, анализируется и интерпретируется столько раз, сколько раз выполняется эта программная ветвь. Простые способы обеспечить это свойство в процессе нисходящего синтаксического разбора состоят в следующем:
- синтаксический анализ условного оператора нужно выполнять полностью, но включать интерпретацию только для той ветви, которая должна выполняться;
- синтаксический анализ любой циклической конструкции должен предусматривать возврат по тексту к началу тела цикла и повторный его синтаксический разбор на каждом шаге.
Сказанное можно проиллюстрировать примером интерпретатора конструкций if и do…while, использующим метод рекурсивного спуска.
// Признак proc=1 выполнение конструкции
void IF(int prc)
{ if (s[i]!=’(‘) { error(); return; }
i++;
int x=W();
if (s[i]!=’)’) { error(); return; }
// Условное выполнение при x=1
i++; OP(proc & x);
if (s[i]==’e’)
// Условное выполнение else при x=0
{ i++; OP(proc & !x); }
}
void DO(int proc)
{ // Запомнить начало тела цикла
int n = i;
do // Повторный синтаксический разбор
{ i=n; // и интерпретация тела цикла
OP(proc);
if (s[i++]!=’w’) { error(); return; }
if (s[i++]!=’(‘) { error(); return; }
} while (W(proc);)
if (s[i++]!=’)‘) { error(); return; }
}