Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700383.doc
Скачиваний:
15
Добавлен:
01.05.2022
Размер:
4.33 Mб
Скачать

9.3.4. Выполнение действий, связанных с лексемами

Выполнение действий в процессе распознавания лексем представляет для лексического анализатора гораздо меньшую проблему, чем определение границ лексем. Фактически конечный автомат, который лежит в основе лексического анализатора, должен иметь не только входной язык, но и выходной. Он должен не только уметь распознать правильную лексему на входе, но и породить связанную с ней последовательность символов на выходе. В такой конфигурации конечный автомат преобразуется в конечный преобразователь.

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

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

f (q,a),

где q - текущее состояние автомата,

а - текущий входной символ.

Функция f (q,a) может выполнять любые действия, доступные лексическому анализатору:

– помещать новую лексему в таблицу лексем;

– проверять наличие найденной лексемы в таблице идентификаторов;

– добавлять новую лексему в таблицу идентификаторов;

– выдавать сообщения пользователю об ошибках и предупреждения об обнаруженных неточностях в программе;

– прерывать процесс компиляции.

Возможны и другие действия, предусмотренные реализацией компилятора.

9.4. Формальные языки и грамматики

9.4.1. Первичные понятия

Определение. Конечное множество символов, неделимых в данном рассмотрении, называется словарем или алфавитом, а символы, входящие в множество, – буквами алфавита.

Например, алфавит A = {a, b, c, +, !} содержит 5 букв, а алфавит B = {00, 01, 10, 11} содержит 4 буквы, каждая из которых состоит из двух символов.

 Определение.  Последовательность букв алфавита называется словом или цепочкой в этом алфавите. Число букв, входящих в слово, называется его длиной.

Например, слово в алфавите A a = ab++c имеет длину l(a)= 5, а слово в алфавите B b=00110010 имеет длину l (b)= 4.

Введем следующие обозначения. Если A – некоторый алфавит, то

  • A* обозначает множество всех предложений, которые составлены из букв алфавита A, включая и пустое предложение.

  • E обозначим пустое предложение, т.е. предложение, не содержащее ни одного символа.

  • А+ обозначает множество всех предложений без пустого предложения.

Например, если А = {0, 1}, то

А * = {$, 0, 1, 00, 01, 10, 11, 000, ...},

А + = {0, 1, 00, 01, 10, 11, ...}.

Определение.  Формальной порождающей грамматикой Г называется следующая совокупность четырех объектов: Г = { Vт, VA, <I> VA, R },

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

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

<I> - начальный символ грамматики <I> VA.

R – множество правил вывода или порождающих правил вида , где и цепочки, построенные из букв алфавита Vт VA, который называют полным алфавитом (словарем) грамматики Г.

В множество правил грамматики могут также входить правила с пустой правой частью вида <Е> . Чтобы избежать неопределенности из-за отсутствия символа в правой части правила, условимся использовать символ пустой цепочки, записывая такое правило в виде <Е> $.

Чтобы установить правила построения цепочек, порождаемых грамматикой, введем следующие понятия.

Определение. Пусть r =  – правило грамматики Г и = ' " – цепочка символов, причем', " (Vт VA) *. Тогда цепочка = ' " может быть получена из цепочки путем применения правила r (т.е. заменой в m цепочки на ). В этом случае говорят, что цепочка непосредственно выведена из цепочки и обозначают .

Определение. Если задана совокупность цепочек = ( 0, 1,...,n), таких, что существует последовательность непосредственных выводов:

0 1, 1 2, ... , n-1  n,

то такую последовательность называют выводом n из 0 в грамматике Г и обозначают

0 * n.

Определение. Множество конечных цепочек терминального алфавита Vт грамматики Г, выводимых из начального символа <I>, называется языком, порождаемым грамматикой Г и обозначается L( Г).

L( Г ) = {Vт* | <I> * }.

Определение. Если язык, порождаемый грамматикой Г, не содержит ни одной конечной цепочки (конечного слова), то он называется пустым.

Утверждение. Для того, чтобы язык L( Г ) не был пустым, в множестве R должно быть хотя бы одно правило вида r = , где  Vт* и должен существовать вывод

<I> * .