- •Введение
- •Порождающие грамматики Хомского Цель
- •Неограниченные грамматики
- •Контекстно зависимые грамматики
- •Контекстно свободные грамматики
- •Автоматные грамматики
- •Эквивалентность грамматик
- •Однозначность грамматик
- •Задачи и упражнения
- •Контрольные вопросы
- •Конечный автомат
- •Детерминированный конечный автомат
- •Построение дка из -нка
- •Задачи и упражнения
- •Контрольные вопросы
- •Регулярные грамматики. Лексический анализатор. Роль лексических анализаторов
- •Лексические ошибки
- •Регулярные выражения
- •Преобразование регулярного выражения в автомат
- •Распознание токенов
- •Задачи и упражнения
- •Контрольные вопросы
- •Автоматы с магазинной памятью
- •Нисходящие методы разбора Устранение левой рекурсии
- •Левая факторизация
- •Метод рекурсивного спуска
- •Пример нисходящего интерпретатора
- •Задачи и упражнения
- •Контрольные вопросы
Конечный автомат
Конечный автомат – абстрактный автомат без выходного потока, число возможных состояний которого конечно. Результат работы автомата определяется по его конечному состоянию.
Детерминированный конечный автомат
Детерминированным конечным автоматом (ДКА) называется такой автомат, в котором для каждой последовательности входных символов существует лишь одно состояние, в которое автомат может перейти из текущего.
Моделирование ДКА
Вход: Входная строка х, завершаемая символом конца файла eof, ДКА D со стартовым состоянием s0 и множеством заключительных состояний F.
Выход: «Да», если D допускает x, и «нет» в противном случае.
Пример 4. Моделирование ДКА.
bool DFA() // Deterministic Finale Automate
{
s = s0;
с = getnextchar();
while (c != eof)
{
// Переход ДКА, находящегося в состоянии s, // в новое состояние по получению
// входного символа c.
s = move(s, c);
c = getnextchar();
}
return (s F) ;
}
-НКА
A=<Q,,,q0, F>
Q – множество состояний
– множество входных символов (алфавит)
q0 – начальное состояние (один из элементов Q)
F, подмножество Q, - множество допускающих состояний
, функция переходов (q| qQ, {})
Моделирование -НКА
Вход: Входная строка х, завершаемая символом конца файла eof, -НКА N со стартовым состоянием s0 и множеством заключительных состояний F.
Выход: «Да», если N допускает x, и «нет» в противном случае.
Пример 5. Моделирование -НКА.
bool NFA() // Nondeterministic Final Automate
{
S = EClosure(s0);
c = getnextchar();
while (c != eof)
{
S = EClosure(move(S, c));
c = getnextchar();
}
return (SF != 0);
}
Построение дка из -нка
Вход: НКА N.
Выход: ДКА D, допускающий тот же язык
Метод: Строим таблицу переходов Dtran для D. Каждое состояние ДКА является множеством состояний НКА, Dtran строится так, чтобы D «параллельно» моделировал все возможные перемещения N по входной строке.
Таблица 4. Операции, которые используют для отслеживания множеств состояний НКА.
Операция |
Описание |
e-замыкание(s) |
Множество состояний НКА, достижимых из состояния s только по -переходам. |
(-closure(s)) |
|
e-замыкание(Т) |
Множество состояний НКА, достижимых из s | sТ только по -переходам. |
(-closure(Т)) |
|
move(T, a) |
Множество состояний НКА, в которые имеется переход из s | sТ по входному символу a |
Где s – состояние НКА; T – множество состояний НКА (T = {s}); Ds = EClosure({s0});
Пример 6. Построение ДКА из -НКА (пример 1).
while (Ds имеет непомеченное состояние T)
{
пометить T;
foreach(входной a)
{
U = Eclosure(move(T,a));
if (U Ds) Добавить U в Ds как непомеченное;
Dt[T,a] = U;
}
}
Eclosure(T)
{
// Поместить все состояния из T в стек.
foreach(s in T) stack.push(s);
// Инициализировать результат множеством T
Eclosure = T;
while (not stack.Empty)
{
t = stack.Pop();
foreach (u с дугой от t к u, помеченной )
{
if (uEclosure)
{
EClosure.Add(u);
stack.Push(u);
}
}
}
}
Рисунок 2. -НКА для L(R), R = (a | b)* abb).
Инициализация:
EClosure (s0) = {0,1,2,4,7}
Ds = {A={0,1,2,4,7}}
Dt = {}
Шаг 1:
B = EClosure(move(A, a)) = EClosure({3,8}) = {1,2,3,4,6,7,8}
C = EClosure(move(A,b)) = EClosure({5}) = {1,2,4,5,6,7}
Dt[A,a] = B
Dt[A,b] = C
Ds = {A={0,1,2,4,7}, B={1,2,3,4,6,7,8}, C={1,2,4,5,6,7}}
Шаг 2:
D = {1,2,4,5,6,7,9}
E = {1,2,4,5,6,7,10}
Рисунок 3. -НКА для L(R), R = (a | b)* abb).