Курс Основы построения трансляторов

       

Особенности интерпретации управляющих структур программы


Принцип интерпретации заключается в одновременном анализе и выполнении программы. При этом сама интерпретация управляющих структур программы (прежде всего, условных и циклических конструкций) должна выполняться одновременно с их синтаксическим анализом. Отсюда следует такой вывод: текст некоторой части программы просматривается, анализируется и интерпретируется столько раз, сколько  раз выполняется эта программная ветвь. Простые способы обеспечить это свойство в процессе нисходящего синтаксического разбора состоят в следующем:

- синтаксический анализ условного оператора нужно выполнять полностью, но включать интерпретацию только для той ветви, которая должна выполняться;

-   синтаксический анализ любой циклической конструкции должен предусматривать возврат по тексту к началу тела цикла и повторный его синтаксический разбор на каждом шаге.

Сказанное можно проиллюстрировать примером интерпретатора конструкций 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; }

     }



Содержание раздела