- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 3. Синтаксический анализ
- •3.1. Автомат с магазинной памятью
- •3.2. Таблично-управляемый предсказывающий разбор
- •3.2.1. Алгоритм разбора сверху-вниз
- •3.2.2. Множества first и follow
- •3.2.3. Конструирование таблиц предсказывающего анализатора
- •3.2.4. Ll(1)-грамматики
- •3.2.7. Рекурсивный спуск
- •3.3. Разбор снизу-вверх типа сдвиг-свертка
- •3.3.1. Основа
- •3.3.2. Lr(k)-анализаторы
- •3.3.4. Конфликты разбора типа сдвиг-свертка
Конечные распознаватели. Основные понятия
Определить принадлежность заданной (входной) цепочки заданному регулярному языку можно с помощью конечного распознавателя. Конечный распознаватель – это конечный автомат Рабина-Скотта, который определяется пятёркой: A=<S, X, s0, , F>, где
S – конечное непустое множество состояний;
X – конечное непустое множество входных символов;
s0S – начальное состояние;
: SXS – функция переходов, которая паре (состояние, входной символ) ставит в соответствие новое состояние (состояние перехода);
FS – множество допускающих состояний.
Конечный распознаватель можно представить как устройство с одним входом, которое в момент времени t может находиться в некотором состоя-нии stS, а на вход поступает символ xtX из входной цепочки. Будем говорить, что распознаватель в момент времени t находится в состоянии st и обрабатывает символ xt. В соответствии с функцией переходов распознаватель перейдёт в новое состояние st+1=( st, xt), st+1S и в следующий момент времени t+1 будет находиться в состоянии st+1 и обрабатывать следующий символ xt+1 входной цепочки. В начальный момент времени t=0 распознаватель находится в начальном состоянии s0 и обрабатывает первый символ входной цепочки. На каждом шаге распознаватель обрабатывает новый (следующий за предыдущим) символ цепочки. Если после обработки последнего символа входной цепочки распознаватель окажется в допускаю-щем состоянии skF, то входная цепочка принадлежит языку (цепочка допускается распознавателем), иначе – не принадлежит языку (цепочка отвергается распознавателем). Другими словами, конечный распознаватель допускает входную цепочку, если она переводит его из начального состояния в одно из допускающих (позволяет “связать” начальное состояние с одним из допускающих). Множество (возможно, бесконечное) всех цепочек, допускаемых конечным распознавателем А, образует язык L(A), допускаемый распознавателем A.
Конечный распознаватель можно задать таблицей, строки которой соответствуют входным символам, а столбцы – состояниям. Первый столбец соответствует начальному состоянию, а столбцы, соответствующие допускающим состояниям будем отмечать символом “1”. Если распознаватель из состояния sj при обработке символа xi переходит в состояние sk, то в клетке таблице на пересечении строки xi и столбца sj записывается состояние sk.
Пример.
|
|
|
|
|
1 |
|
s0 |
s1 |
s2 |
s3 |
s4 |
ц |
s2 |
s2 |
s2 |
s4 |
s4 |
. |
s3 |
s3 |
s4 |
|
|
+ |
s1 |
|
|
|
|
- |
s1 |
|
|
|
|
Этой таблицей представлен конечный распознаватель, имеющий шесть состояний S={s0, s1, s2, s3, s4, Error} и четыре входных символа X={ц, ., +, -} . Состоянию Error не соответствует столбец таблицы. Это особое состояние ошибки, из которого невозможен переход в какое либо состояние, отличное от него, а, следовательно, из него недостижимо допускающее состояние. Если в процессе обработки входной цепочки распознаватель переходит в состояние ошибки, то цепочка отвергается независимо от необработанной её части. Переходам в состояние ошибки соответствуют пустые клетки. Допускающее состояние одно F={s4} , обозначено символом “1” в верхней строке.
Конечный распознаватель можно задать ориентированным графом. Вершинам графа соответствуют состояния, а дугам – переходы. В вершинах записываются состояния, а на дугах – входые символы. Если распознаватель из состояния sj при обработке символа xi переходит в состояние sk, то из вершины sj проводится дуга, отмеченная символом si, в вершину sk. Вершина, соответствующая состоянию ошибки, и дуги, ведущие в состояние ошибки, в графе не изображаются (подразумеваются). Начальное состояние отмечается стрелочкой, а допускающие состояния выделяются жирной линией.
Пример.
Граф распознавателя, представленного выше таблицей.
ц
ц
ц
. ц
+
- .
ц
.
Конечный распознаватель называется полностью определённым, если определено состояние перехода для каждой пары (состояние, входной символ). В противном случае распознаватель называется неполностью определённым или частичным. В дальнейшем будем рассматривать только полностью определённые распознаватели.
Конечный распознаватель, который не может одновременно находиться более чем в одном состоянии, называется детерминированным. Определённый выше конечный распознаватель является детерминированным, т.к. имеет только одно начальное состояние (находится в одном состоянии в начальный момент времени) и функция переходов задаёт единственное следующее состояние (состояние перехода) для любой пары (состояние, входной символ).
Конечный распознаватель, который может одновременно находиться более чем в одном состоянии, называется недетерминированным. Недетерминированный распознаватель может иметь несколько начальных состояний и может перейти из состояния при обработке входного символа более чем в одно состояние. Недетерминированный конечный распознаватель не подпадает под данное ранее определение конечного распознавателя.
Конечный недетерминированный распознаватель определяется пятёркой: A=<S, X, S0, , F>, где
S – конечное непустое множество состояний;
X – конечное непустое множество входных символов;
S0 S – множество начальных состояний;
: SX2S, где 2S обозначает булеан S, т.е. множество всех подмножеств множества S – функция переходов, которая паре (состояние, входной символ) ставит в соответствие подмножество состояний;
FS – множество допускающих состояний.
Недетерминированный распознаватель, также как и детерминированный, можно задать таблицей или графом. В клетках таблицы недетерминированного распознавателя записываются множества состояний переходов, а столбцы, соответствующие начальным состояниям, отмечаются символом “”. В графе недетерминированного распознавателя из одной вершины могут выходить различные дуги, отмеченные одним и тем же входным символом.
Пример.
Таблица недетерминированного распознавателя.
|
|
|
|
|
|
1 |
|
s0 |
s1 |
s2 |
s3 |
s4 |
s5 |
ц |
s1,s3 |
s1,s3 |
|
|
s5 |
s5 |
. |
s4 |
|
s4 |
s5 |
|
|
+ |
s1,s2 |
|
|
|
|
|
- |
s1,s2 |
|
|
|
|
|
Пример.
Граф недетерминированного распознавателя.
. . ц
+,-
ц
ц,+,-
ц
ц ц .
Недетерминированный распознаватель может из состояния перейти в пустое множество состояний. Если при обработке входной цепочки множество текущих состояний в некоторый момент времени окажется пустым, то распознаватель прекращает работу и цепочка отвергается.
Цепочка допускается недетерминированным конечным распознавателем, если после обработки последнего символа входной цепочки он будет находиться во множестве состояний, содержащих в себе хотя бы одно из допускающих. Если распознаватель представить в виде графа, то допустимой цепочке соответствует путь, помеченный символами этой цепочки, из началь-ного состояния хотя бы в одно из допускающих.
Очевидно, что детерминированные конечные распознаватели являются подклассом недетерминированных конечных распознавателей.
Недетерминированный распознаватель, который может перейти на некотором шаге из состояния в состояние без обработки символа входной цепочки, называется недетерминированным конечным распознавателем с -переходами.
Конечный недетерминированный распознаватель с -переходами определяется пятёркой: A=<S, X, S0, , F>, где
S – конечное непустое множество состояний;
X – конечное непустое множество входных символов;
S0 S – множество начальных состояний;
: S{X}2S, где 2S обозначает булеан S, т.е. множество всех подмножеств множества S – функция переходов, которая паре (состояние, входной символ) или паре (состояние, ) ставит в соответствие подмножество состояний;
FS – множество допускающих состояний.
Таблица недетерминированного распознавателя с -переходами отличается от таблицы недетерминированного распознавателя без -переходов наличием дополнительной строки, соответствующей пустому символу . В графе распознавателя -переходу соответствует дуга, отмеченная символом .
Пример.
Таблица недетерминированного распознавателя с -переходами.
|
|
|
|
|
|
|
1 |
|
s0 |
s1 |
s2 |
s3 |
s4 |
s5 |
s6 |
ц |
|
s1,s3 |
|
|
s5 |
s5 |
|
. |
|
|
s4 |
s5 |
|
|
|
+ |
s1,s2 |
|
|
|
|
|
|
- |
s1,s2 |
|
|
|
|
|
|
|
s1,s2 |
|
|
|
|
s6 |
|
Пример.
Граф недетерминированного распознавателя с -переходами.
ц
ц
+,-, . ц
+,-, ц
.
Недетерминированные конечные распознаватели являются подклассом недетерминированных конечных распознавателей с -переходами.
Два конечных распознавателя (детерминированных, недетерминированных с -переходами или без них) называются эквивалентными, если равны допускаемые ими языки. Процедуру получения недетерминированного конечного распознавателя без -переходов, эквивалентного заданному недетерминированному конечному распознавателю с -переходами назовём устранением -переходов. Процедуру получения детерминированного конечного распознавателя, эквивалентного заданному недетерминированному конечному распознавателю назовём преобразованием недетерминированного конечного распознавателя в детерминированный.
