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


Пример: cемантика данных для Си-компилятора - часть 3


case PTR: return 2;            

// Размерность массива – произведение числа элементов

// на размерность вложенного ТД

case ARR: return dim * GetSize(p->child);

// Размерность структуры – сумма размерностей элементов

case STRU:

      int s,i;

      for (s=0,i=0; i<dim; i++)

s+=GetSize(&(p>child[i]));

      return s;

// Размерность объединения – максимальная размерность элемента

case STRU:

      int s,i,k;

      for (s=0,i=0; i<dim; i++)

{ k=GetSize(&(p->child[i])); if (k>s) s=k; }

      return s;

}}            

 

Содержание семантической таблицы для переменной естественным образом вытекает из ее основных свойств в языке и может включать в себя:

-   имя переменной;

-   указатель на описание типа в таблице типов;

-   смещение (адрес), который получает эта переменная при трансляции в том сегменте данных, где она размещается компилятором;

-   указатель на область памяти, где размещаются ее значение – для интерпретатора.

Анализ семантики переменных при таком подходе может выглядеть следующим образом:

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

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




Начало  Назад  Вперед



Книжный магазин