Разработка компиляторов

       

Атрибуты лексем


Поскольку весьма часты ситуации, в которых более чем одна лексема принадлежит одному лексическому классу, лексический анализатор должен предоставлять дополнительную информацию о том, какая конкретная лексема была выделена. Например, в лексический класс Number_LC попадет и строка 1, и строка 0, однако последующим этапам компилятора (скажем, кодогенератору) было бы полезно знать конкретное значение константы в исходной программе. Такую информацию можно записывать в атрибуты лексем; обычно лексема имеет только один атрибут - ссылку в некоторую таблицу с дополнительной информацией. В целях диагностики мы можем также сохранить номера строк начала и конца этой лексемы в исходной программе.

Пример. Рассмотрим следующий фрагмент программы на C#:

bool c; int a=1,b=2; c = a>b>>2;

Последний оператор порождает следующую последовательность лексем и их атрибутов:

<Identifier_LC, указатель в таблицу на с> <AssignOP_LC,> <Identifier_LC, указатель в таблицу на a> <GreaterThanOP_LC,> <Identifier_LC, указатель в таблицу на b> <RightShiftOP_LC,> <Number_LC, указатель в таблицу на 2>

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

struct LEXEME { ushort LexClass; ReprInd ReprTabPtr; FilePos beg; FilePos end; }



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