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


Восходящие методы анализа. Свертка-перенос - часть 4


То есть последовательность расположения правил с одинаковой правой частью в списке может влиять на правильность синтаксического разбора. А именно: если есть два правило с одинаковым окончанием правой части, то более длинное должно находиться в начале списка.

 

int      TESTGR()

{ char *ss,*q; int      n,j;

for (n=0; GR[n] !=NULL; n++)      // Поиск правила

      { for (q=ss=GR[n]+2; *ss !='\0'; ss++);

      ss--;

      for(j=sp; (ss>=q) && (m[j]==*ss); j--,ss--);

      if (q== ss+1)                  // Свертка

            { j++; sp=j; m[sp]=*GR[n];

m[sp+1]='\0'; return(1); }

      }

return (0);}

 

4. Семантический анализ

Семантический анализ является наименее формализуемой частью процесса трансляции,  поскольку касается “смысла” тех конструкций языка, которые анализируются на этапах лексического и синтаксического анализа. Если же подходить к этому процессу с точки зрения “здравого смысла”, то транслятор должен построить в процессе трансляции в памяти некоторую структуру данных, в которой зафиксировать все смысловые (семантические) взаимоотношения между объектами программы. Обычно объектами программы являются типы, переменные и функции (процедуры), которые обозначаются именами (идентификаторами). Для них уже на этапе лексического анализа может быть составлена таблица, которая на этапе семантического анализа дополняется данными о семантике объектов. Отсюда вырисовывается общая схема взаимодействия фаз транслятора:

-   Обычно транслятор создает несколько  семантических таблиц, по видам используемых в языке объектов, поскольку содержание их может быть в принципе различным. Например, в Си-компиляторе имеет смысл заводить таблицы типов, локальных и глобальных переменных, функций. Таблицы эти заполняются семантическими процедурами при свертывании соответствующих правил. Например, при свертывании определения переменной ее имя должно заноситься в таблицу локальных или глобальных имен;

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


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