Все, что находится в файле спецификации лексем до первой разделительной пары знаков процента %%, генератор LEX считает относящимся к секции описаний. Эта секция содержит декларативную информацию для секций правил и подпрограмм. В общем случае в секции описаний могут быть декларированы:


Перечисленные декларации должны начинаться с начальной позиции строк секции описаний. Только в этом случае они могут быть соответствующим образом интерпретированы генератором LEX. Любые строки секции описаний, которые содержат лидирующие символы пробела и табуляции, без обработки копируются в исходный код программы лексического анализатора. Это обычно используется, чтобы включать в секцию описаний необходимые комментарии, которые должны задаваться в формате языка программирования C. Аналогичным образом в секцию описаний можно включать объявления внешних переменных программы лексического анализатора или иные законченные конструкции языка программирования C, которые не обязаны начинаться с первой позиции строки.
В некоторых случаях важно иметь возможность включать в секцию описаний глобальные спецификации, которые не являются конструкциями генератора LEX, но должны начинаться с первой позиции строки, например, директивы препроцессора системы программирования C, в частности, директивы #if, #else, #ifdef, #ifndef, #endif, #line, #define и #include. Такие глобальные спецификации должны быть размещены между служебными ограничителями %{ и %}, которые располагаются в отдельных строках секции описаний, начиная с первой позиции. Все, что находится между ними, образует блок описаний, любые инструкции которого имеют глобальный характер для остальных секций файла спецификации лексем и без изменений копируются генератором LEX в исходный код проектируемой программы лексического анализатора. Следует отметить, что некоторые реализации генератора LEX также допускают включать блок описаний в секцию правил файла спецификации лексем.
Пример оформления блока описаний демонстрирует следующий фрагмент программного кода, макросы и переменные которого могут быть полезны для обработки скобочных конструкций:

/*  Блок глобальных описаний для скобочных конструкций */
%{

#include "y.tab.h"
#define LEFTBRACKET          '('     /* код открывающей скобки */
#define RIGHTBRACKET         ')'     /* код закрывающей скобки */
extern int bracketcount;             /* декларация счетчика скобок */    
int bracketcount = 0;                /* инициализация счетчика скобок */

%}

Этот блок описаний содержит директивы препроцессора системы программирования C #include и #define, которые применяются для подключения заголовочного файла y.tab.h и макроопределений скобочных символов LEFTBRACKET и RIGHTBRACET с целью последующего использования в секциях правил и подпрограмм файла спецификации лексем. В соответствии с правилами языка программирования C эти декларации должны начинаться с первой позиции строки и поэтому не могут быть специфицированы за пределами блока описаний. Следующее за ними инструкции объявления, определения и инициализации внешней целочисленной переменной bracketcount не обязательно должны начинаться с первой позиции строки. Поэтому эти инструкции могут быть расположены в любой строке за пределами блока описаний, после символов пробела или табуляции аналогично комментарию перед блоком. В данном случае они включены в блок описаний исходя из косметических соображений.
Если содержимое блока описаний и комментарии просто копируются в файл спецификации лексем, то конструкции остальных служебных директив секции описаний ориентированы на обработку генератором LEX. На практике наиболее часто используются директивы, которые декларируют метки предусловий и макросы регулярных определений для секции правил.
Метки предусловий используются для идентификации состояний лексического анализатора при обработке регулярных выражений с левым контекстом в секции правил. В секции описаний все необходимые метки предусловий должны быть объявлены служебной директивой %START, которая указывается с первой позиции строки.
Например, следующая декларация секции описаний объявляет метку предусловия STATE для последующего использования в секции правил:

%START STATE

Если необходимо задать несколько меток предусловий, то они должны быть перечислены после директивы %START через пробел. В частности, следующая декларация объявляет метки предусловий STATE1 и STATE2 для секции правил:

%START STATE1 STATE2

Следует отметить, что название этой служебной директивы допустимо задавать строчными буквами, например, %start или %Start, а также сокращать до одного символа, то есть, %s или %S. Обязательно только то, чтобы строка, содержащая данную директиву в любой допустимой форме, была первой строкой секции описаний.
Регулярные определения обычно применяются для упрощения и унификации записи регулярных выражений. Все необходимые регулярные определения специфицируются в секции описаний строками следующего вида:

MACRO        REGULAR

В этой строке MACRO обозначает произвольное алфавитно-цифровое имя, которое начинается с буквы и используется в дальнейшем как макрос для подстановки регулярного выражения REGULAR в другие регулярные выражения или определения секций описаний и правил. Генератор LEX гарантирует автоматическую подстановку значения регулярного определения в любое регулярное выражение файла спецификации лексем, где его имя указано в фигурных скобках. Например, следующая последовательность строк регулярных определений формирует макрос IDENT, который обозначает регулярное выражение, необходимое для поиска идентификаторов в исходных текстах программ:

ALPHA      [a-zA-Z]
DIGIT       [0-9]
IDENT      {ALPHA}({ALPHA}|{DIGIT})*

В итоговом регулярном выражении использованы регулярные определения ALPHA и DIGIT для обозначения латинских букв и цифр, соответственно. Генератор LEX автоматически подставляет, соответствующие им регулярные выражения в регулярное выражение, обозначаемое макросом IDENT. В результате подстановки для макроса IDENT получается следующее регулярное определение:

IDENT      [a-zA-Z]([a-zA-Z]|[0-9])*

согласно которому под идентификатором понимается любая алфавитно-цифровая последовательность символов, которая начинается с латинской буквы. Аналогичным образом, регулярное определение, заданное макросом IDENT, может быть использовано в регулярных выражениях секции правил или других регулярных определениях секции описаний также как макросы ALPHA и DIGIT.
В частности, макрос DIGIT может быть применен для формирования следующего регулярного определения вещественных чисел:

REAL       [+-]?(({DIGIT}+"."{DIGIT}*)|"."{GIGIT}+)

С учетом автоматической подстановки регулярного определения для макроса DIGIT оно эквивалентно следующей конструкции:

REAL       [+-]?(([0-9]+"."[0-9]*)|"."{DIGIT}+)

Кроме декларации перечисленных внешних объектов для секций правил и подпрограмм файла спецификации лексем, в секции описаний могут быть заданы размеры некоторых внутренних таблиц программы проектируемого лексического анализатора, если их значения должны отличаться от величин, которые по умолчанию устанавливает генератор LEX. Для спецификации внутренних таблиц в программе лексического анализатора используется структура фиксированных массивов, которые имеют ограниченный предельный размер. Поэтому в некоторых случаях, например, когда в секции правил файла спецификации лексем используются сложные регулярные выражения с большим числом операндов и операций, возможно переполнение внутренних таблиц лексического анализатора, размеры массивов которых приняты по умолчанию.
Желаемые размеры внутренних таблиц программы лексического анализатора специфицируются строками секции описаний, которые имеют следующий формат:

%X       SIZE

В этой строке литера X после служебного символа % обозначает код внутренней таблицы лексического анализатора, а параметр SIZE устанавливает ее требуемый размер. Каждая из таких деклараций должна начинаться с первой позиции новой строки секции описаний, а части, определяющие код и размер таблицы, могут разделять произвольное число символов пробела или табуляции. При этом значение размера таблицы специфицируется неотрицательным целым десятичным числом. Код таблицы задается одной из латинских букв E, P, N, A ,K или O, которые имеют следующий смысл:

E таблица вершин синтаксического дерева регулярного выражения;
P таблица позиций вершин синтаксического дерева регулярного выражения;
N таблица состояний в конечном автомате лексического анализатора;
A таблица переходов в конечном автомате лексического анализатора;
K таблица классов символов в регулярных выражениях;
O таблица выходных элементов.

Например, следующая декларация секции описаний устанавливает допустимое число состояний в таблице состояний конечного автомата лексического анализатора равным 500 вместо значения, принятого по умолчанию:

%N       500

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