ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Структура Lex-программы
Lex-программа включает разделы опредeлений, правил и пользовательских программ. Рассмотрим подробнее способы оформления этих разделов.
Все строки, в которых занята первая позиция, относятся к Lex-программе. Любая строка, не являющаяся частью правила или действия, которая начинается с пробела или табуляции, копируется в сгенерированную программу lex. yy. c - результат работы lex.
Раздел определений Lex-программы
Определения, предназначенные для lex, помещаются перед первым %%. Любая строка этого раздела, не содержащаяся между %{ и %} и начинающаяся в первой колонке, является определе- нием строки подстановки lex. Раздел определений Lex- программы может включать:
начальные условия, определения, фрагменты программы пользователя, таблицы наборов символов, указатели host-языка, изменения размеров внутренних массивов, комментарии в формате host-языка.
НАЧАЛЬНЫЕ УСЛОВИЯ задаются в форме:
%START имя1 имя2...
Если начальные условия определены, то эта строка должна быть первой в Lex-программе.
ОПРЕДЕЛЕНИЯ задаются в форме:
Имя трансляция
В качестве разделителя используется один или более пробелов или табуляций. Пример:
БУКВА [A-ZА-Яa-zа-я_] DIGIT [0-9] ИДЕНТИФИКАТОР { БУКВА }({ БУКВА }|{ DIGIT })*
Имя - как обычно, любая последовательность букв и цифр, начинающаяся с буквы. Трансляция - это регулярное выражение (или его часть), которое будет подставлено всюду там, где указано имя (смотрите третью строку этого примера).
ФРАГМЕНТЫ ПРОГРАММЫ ПОЛЬЗОВАТЕЛЯ указываются двумя спо- собами:
- в виде " пробел фрагмент ";
- в виде:
%{ Строки Фрагмента Программы Пользователя %}
Такая форма включения пользовательского фрагмента необходима для ввода, например, макроопределений Си, которые должны начинаться в первой колонке строки. Все строки фрагмента пользовательской программы, раз- мещенные в разделе определений, будут являться внеш- ними для любой функции программы lex. yy. c
ТАБЛИЦА НАБОРОВ СИМВОЛОВ задается в виде:
%T целое _ число строка _ символов ......... целое _ число строка _ символов %T
Сгенерированная программа lex. yy. c осуществляет ввод-вывод символов посредством библиотечных функций lex с именами input, output, unput. Таким образом, lex помещает в yytext символы в представлении, используемом в этих библиотечных функциях. Для внутреннего использования символ представля- ется целым числом, значение которого образовано набором битов, представляющих символ в конкретной ЭВМ. Пользователю предоставляется возможность менять представление символов (целых констант) с помощью таблицы наборов символов. Если таблица символов присутствует в разделе определений, то любой символ, появляющийся либо во входном потоке, либо в правилах, должен быть определен в таблице символов. Символам нельзя назначать число 0 и число, большее числа, выделенного для внутреннего представления символов конкретной ЭВМ.
Пример:
%T 1 Aa 2 Bb 3 Cc . . . 26 Zz 28 + 29 - 30 0 31 1 . . . 39 9 %T
В этом примере символы верхнего и нижнего регистров перево- дятся в числа 1-26, символ новой строки в 27, "+" и "-" переводятся в числа 28 и 29, а цифры - в числа 30-39.
ИЗМЕНЕНИЯ РАЗМЕРА ВНУТРЕННИХ МАССИВОВ задаются в форме:
%x число
число - новый размер массива; x - одна из букв:
p - позиции; n - состояния; e - узлы дерева; a - упакованные переходы; k - упакованные классы символов; o - массив выходных элементов.
lex имеет внутренние таблицы, размеры которых ограничены. При построении программы лексического анализа может прои- зойти переполнение любой из этих таблиц, о чем lex сообщает при построении лексического анализатора. Пользователю пре- доставляется возможность изменить размеры таблиц (сокращая размеры одних и увеличивая размеры других) таким образом, чтобы они не переполнялись. Естественно, эти изменения воз- можны лишь в пределах той памяти, которая выделяется под процесс.
Ниже перечислены размеры таблиц, которые устанавлива- ются по умолчанию:
p - позиций 1500 n - состояний 300 e - узлов 600 a - упакованных переходов 1500 k - упакованных классов символов 1000 o - выходных элементов 1500
Для того чтобы определить, каковы размеры таблиц и насколько они заняты, можно использовать флаг -v, например:
% lex -v source. l 33/600 узлов(%e) 97/1500 позиций(%p) 17/300 состояний(%n) 2551 переходов 18/1000 упакованных классов символов(%k) 41/1500 упакованных переходов(%a) 68/1500 выходных элементов(%o) %
Здесь показано сообщение, которое выводит lex по флагу -v. Число перед символом "/" указывает сколько элементов массива занято, а число за символом "/" указывает установленный раз- мер массива.
КОММЕНТАРИИ в разделе определений задаются в форме host-языка и должны начинаться не с первой колонки строки.
Раздел правил
Все, что указано после первой пары %% и до конца Lex- программы или до второй пары %%, если она указана, относится к разделу правил. Раздел правил может содержать правила и фрагменты программ. Фрагменты программ, содержащиеся в раз- деле правил, становятся частью функции yylex файла lex. yy. c, в которой осуществляется выполнение действий активных пра- вил. Фрагмент программы указывается следующим образом:
%{ Строки Фрагмента Программы %}
Например:
%% %{ #include file. h %} . . .
Здесь строка " #include file. h " станет строкой функции yylex ().
Раздел правил может включать список активных и неактив- ных (помеченных) правил. Активные и неактивные правила могут быть указаны в любом порядке, в том числе быть "пере- мешанными" в списке. Активные правила выполняются всегда, неактивные только по ссылке на них оператором BEGIN.
Активное правило имеет вид:
ВЫРАЖЕНИЕ ДЕЙСТВИЕ
Неактивное правило имеет вид:
< МЕТКА > ВЫРАЖЕНИЕ ДЕЙСТВИЕ или < СПИСОК _ МЕТОК > ВЫРАЖЕНИЕ ДЕЙСТВИЕ
где СПИСОК _ МЕТОК имеет вид:
метка1, метка2,...
В качестве первого правила раздела правил может быть правило вида:
BEGIN МЕТКА;
В этом правиле отсутствует ВЫРАЖЕНИЕ, и первым действием в разделе правил будет активизация помеченных правил. Для возвращения автомата в исходное состояние можно использовать действие:
BEGIN 0;
Важно отметить следующее. Если Lex-программа содержит актив- ные и неактивные правила, то активные правила работают всегда. Оператор " BEGIN МЕТКА;" просто расширяет список активных правил, активируя помеченные меткой МЕТКА. А опера- тор " BEGIN 0;" удаляет из списка активных правил все поме- ченные правила, которые до этого были активированы. Кроме того, если из помеченного и активного в данный момент вре- мени правила осуществляется действие BEGIN МЕТКА, то из помеченных правил активными останутся только те, которые помечены меткой МЕТКА.
Не нашли, что искали? Воспользуйтесь поиском:
|