Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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 МЕТКА, то из

помеченных правил активными останутся только те, которые

помечены меткой МЕТКА.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных