Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Layt_teor_osnovy_form_yazykov.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.17 Mб
Скачать

2. Регулярные выражения и конечные автоматы.

2.1. Диаграммы состояний.

Рассмотрим регулярную грамматику G[Z]:

Z::=U0|V1

U::=Z1|1

V::=Z0|0

Легко видеть, что порождаемый ею язык состоит из последовательностей, образуемых парами 01 или 10, т.е.

L(G)= {Bn|n>0}, где B={01,10}.

Чтобы облегчить распознавание предложений грамматики G, нарисуем диаграмму состояний (рис. 2.1). В этой диаграмме каждый нетерминал грамматики G представлен узлом или состоянием; кроме того, есть начальное состояние S (предполагается, что грамматика не содержит нетерминала S). Каждому правилу Q::=T в G соответствует дуга с пометкой T, направленная от начального состояния S к состоянию Q. Каждому правилу Q::=RT соответствует дуга с пометкой T, направленная от состояния R к состоянию Q.

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

1. Первым текущим состоянием считать начальное состояние S. Начать с самой левой литеры в цепочке x и повторять шаг 2 до тех пор, пока не будет достигнут правый конец x.

2. Сканировать следующую литеру x, продвинуться по дуге, помеченной этой литерой, переходя к следующему текущему состоянию. Если при каком-то повторении шага 2 такой дуги не оказывается, то цепочка x не является предложением и происходит останов. Если мы достигаем конца x, то x - предложение тогда и только тогда, когда последнее текущее состояние есть Z.

В этих действиях можно узнать восходящий разбор. На каждом шаге (кроме первого) основой является имя текущего состояния, за которым следует входной символ. Символ, к которому приводится основа, будет именем следующего состояния. В качестве примера проведем разбор предложения 101001. Каждая строка на рис.2.2,a отражает состояние разбора перед началом выполнения шага 2.

Рис.2.1. Диаграмма состояний.

Рис.2.2. Разбор и синтаксическое дерево для цепочки 101001.

a - разбор; б - синтаксическое дерево.

В этом примере разбор выглядит столь простым благодаря простому характеру правил. Так как нетереминалы встречаются лишь как первые символы правой части, на первом шаге первый символ предложения всегда приводится к нетерминалу. На каждом последующем шаге первые два символа UT сентенциальной формы UTt приводятся к нетерминалу V, при этом используется правило V::=UT. При выполнении этой редукции имя текущего состояния - U, а имя следующего текущего состояния - V. Так как каждая правая часть единственна, то единственным оказывается и символ, к которому она приводится. Синтаксические деревья для предложений регулярных грамматик всегда имеют вид, подобный изображенному на рис.2.2,б.

Чтобы избавиться от проверки на каждом шаге, есть ли дуга с соответствующей пометкой, можно добавить еще одно состояние, называемое F (НЕУДАЧА), и добавить все необходимые дуги от всех состояний к F. Добавляется также дуга, помеченная всеми возможными литерами и ведущая из F обратно в F. В результате диаграмма, показанная на рис.2.1,а изменится и станет такой, как на рис.2.1,б.

2.2. Детерминированный конечный автомат.

Чтобы иметь возможность легко манипулировать с диаграммами состояний, нам необходима дальнейшая формализация концепции терминах состояний, входных литер, начального состояния S, "отображения" М, которое по заданному текущему состоянию Q и входной литере T указывает следующее текущее состояние, и заключительных состояний, аналогичных состоянию Z в приведенном выше примере.

О п р е д е л е н и е 2.1. (Детерминированный) автомат с конечным числом состояний (КА) - это пятерка (K, VT, M, S, Z), где

1) K - алфавит элементов, называемых состояниями;

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

3) M - отображение (или функция) множества K x VT во множество K (если M(Q,T)=R, то это означает, что из состояния Q при входной литере T происходит переключение в состояние R);

4) S(K) - начальное состояние;

5) Z - непустое множество заключительных состояний, каждое из которых принадлежит K.

Мы можем также формально определить, как работает КА (или диаграммы состояний) с входной цепочкой t. Сделаем это, расширив понятие отображения, которое указывает нам, как переключаются состояния в зависимости от входной литеры. Определим:

М(Q, )=Q при любых Q;

M(Q,Tt)=M(M(Q,T),t) для любых tVT* и TVT.

Первая строка означает, что если на входе пустой символ, то состояние остается прежним. Вторая строка показывает, что в состоянии Q и при входной цепочке Tt мы применяем M, чтобы перейти в состояние P=M(Q,T) с входной цепочкой t, и затем применяем цепочку t (цепочка t считается допускаемой), если M(S,t)=P, где состояние P принадлежит множеству заключительных состояний Z.

Такие автоматы называются детерминированными, так как на каждом шаге входная литера однозначно определяет следующее текущее состояние.

П р и м е р 2.1. Диаграмме состояний, показанной на рис.2.1, соответствует KA ({S, Z, U, V, F}, {0, 1}, M, S, {Z}), где

Теперь остановимся на некоторое время и посмотрим, чего же мы достигли. Мы начали с рассмотрения регулярной грамматики, которая имела единственные правые части. Для нее мы смогли построить диаграмму состояний. Эта диаграмма фактически была неформальным представлением KA. Легко видеть, что если предложение x принадлежит грамматике G, то оно также допускается KA, соответствующим грамматике G. Несколько труднее показать, что для любого KA существует грамматика G, порождающая только те предложения, которые являются цепочками, допускаемыми KA.

Представление в ЭВМ.

KA с состояниями S1,...,Sn и входными литерами T1,...,Tm можно представить матрицей В, состоящей из n x m элементов. Элемент В[i,j] содержит число k - номер состояния Sk, такого, что M[Si,Tj]=Sk. Можно условиться, что состояние S1 - начальное, а список заключительных состояний представлен вектором. Такая матрица иногда называется матрицей переходов, поскольку она указывает, каким образом происходит переключение из одного состояния в другое.

Другим способом представления может быть списочная структура. Представление каждого состояния с k дугами, исходящими из него, занимает 2*k+2 слов. Первое слово - имя состояния, второе - значение k. Каждая последующая пара слов содержит терминальный символ из входного алфавита и указатель на начало представления состояния, в которое надо перейти по этому символу.

2.3. НЕДЕТЕРМИНИРОВАННЫЙ КА.

Мы попадаем в затруднительное положение при построении KA, если G содержит правила

V::=UT и W::=UT

с одинаковыми правыми частями. Это означает, что в диаграмме состояний есть две дуги, помеченные T и исходящие из U, и отображение M оказывается неоднозначным! Автомат, построенный по такой диаграмме, называется недетерминированным KA и определяется следующим образом:

О п р е д е л е н и е 2.2. Недетерминированным KA или НКА называется пятерка (K, VT, M, S, Z) где

1) K - алфавит состояний;

2) VT - входной алфавит;

3) M - отображение множества K x VT в подмножества множества K;

4) SK - множество начальных состояний;

5) ZK - множество заключительных состояний.

И опять важным отличием является то, что отображение M дает не единственное состояние, а (возможно, пустое) множество состояний.

Второе отличие состоит в том, что может быть несколько начальных состояний. Как и ранее, расширим отображение М до K x VT* , определяя

M(Q, )={Q} и

M(Q, Tt) - как объединение множеств M(P, t), где PM(Q,T) для каждого TVT и tVT+. Продолжим расширение, определяя M({P1,P2,...,Pn}, t) как объединение множеств M (Pi, t) для i=1,..., n.

Цепочка t допускается автоматом, если найдется состояние P, которое принадлежит одновременно M(S, t) и множеству заключительных состояний Z.

В качестве примера рассмотрим регулярную грамматику G[Z]:

Z::= U1| V0 | Z0 | Z1

U::= Q1 | 1

V::= Q0 | 0

Q::= Q0 | Q1 | 0 | 1

Краткое рассмотрение показывает, что язык L(G) представляет собой множество последовательностей из 0 и 1, содержащих, по крайней мере, два смежных 0 или две смежные 1. (Чтобы убедиться в этом, начните вывод предложений из Z). На рис.2.3,а приводится соответствующая диаграмма состояний, а на рис.2.3,б - НКА. Состояние НЕУДАЧА представлено здесь подмножеством , не содержащим символов.

Проблема состоит в том, что теперь на каждом шаге может быть более одной дуги, помеченной следующей входной литерой, так что мы не знаем, какой путь выбрать. На каждом шаге известна основа текущей сентенциальной формы, но не известно, к чему она приводится. Можно сказать, что цепочка 01001 допускается определенной выше машиной, если на каждом шаге выбирается правильный путь. Вначале мы находимся в состоянии S. Прочитав первый 0, мы можем переключиться либо в состояние V, либо в Q; выбираем Q. Так как следующий символ 1, то третье состояние либо U, либо Q; вновь выберем Q.

Рис.2.3. Диаграмма состояний и ее НКА.

На следующей схеме показан полный разбор:

Теперь заметим, что для любой регулярной грамматики G можно построить диаграмму состояний и, следовательно, НКА. Диаграмма состояний может иметь любое число начальных состояний. Совершенно очевидно, что любое предложение грамматики G допускается этим НКА; говоря иначе, при работе НКА выполняется восходящий разбор. Как и в случае детерминированного автомата, для любого НКА можно найти регулярную грамматику G, предложения которой будут именно теми цепочками, которые допускаются НКА.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]