- •Введение
- •Порождающие грамматики Хомского Цель
- •Неограниченные грамматики
- •Контекстно зависимые грамматики
- •Контекстно свободные грамматики
- •Автоматные грамматики
- •Эквивалентность грамматик
- •Однозначность грамматик
- •Задачи и упражнения
- •Контрольные вопросы
- •Конечный автомат
- •Детерминированный конечный автомат
- •Построение дка из -нка
- •Задачи и упражнения
- •Контрольные вопросы
- •Регулярные грамматики. Лексический анализатор. Роль лексических анализаторов
- •Лексические ошибки
- •Регулярные выражения
- •Преобразование регулярного выражения в автомат
- •Распознание токенов
- •Задачи и упражнения
- •Контрольные вопросы
- •Автоматы с магазинной памятью
- •Нисходящие методы разбора Устранение левой рекурсии
- •Левая факторизация
- •Метод рекурсивного спуска
- •Пример нисходящего интерпретатора
- •Задачи и упражнения
- •Контрольные вопросы
Контрольные вопросы
В чём особенности детерминированного и недетерминированного конечных автоматов?
Как производится построение -НКА из ДКА?
Опишите операции, используемые при отслеживания множеств состояний НКА.
Может ли любой недетерминированный конечный автомат может быть преобразован в детерминированный так, чтобы их языки совпадали?
Как зависит число состояний ДКА, полученного из НКА от количества состояний исходного автомата в худшем случае?
Назовите известные вам способы описания конечного автомата.
Сколько может быть состояний, в которые может перейти ДКА для каждой последовательности входных символов?
Регулярные грамматики. Лексический анализатор. Роль лексических анализаторов
Задача: чтение символов исходного текста программы и выдача последовательности токенов.
Удаление комментариев и не несущих смысловой нагрузки пробелов (табуляции и т.п.) из строки исходного кода.
Согласование сообщений об ошибках компиляции и текста исходной программы.
Реализация макросов и директив препроцессора.
Фазы:
Сканирование
Лексический анализ
Таблица 6. Токены, шаблоны, лексемы.
Токен |
Лексема |
Шаблон (неформально) |
const |
const |
const |
if |
if |
if |
relation |
<,>,<=,>=,=,<>,>,>= |
< или <= или >= или… |
id |
Pi, count, p2 |
Буква, за которой следуют буквы и цифры |
num |
3.141592, 0, -1 |
Любая числовая константа |
literal |
‘This is a test of pattern’ |
Любые символы между кавычками, исключая сами кавычки |
Токен – терминальный символ грамматики.
Лексема – строка символов исходного языка, соответствующая шаблону токена.
Шаблон – правило, описывающее набор лексем
Лексические ошибки
Ошибкой лексического анализа является невозможность распознать лексему по заданным возможным шаблонам.
Восстановление после ошибки:
удалить лишние символы;
вставить пропущенные;
замена неверного символа верным;
перестановка соседних символов.
Синтаксические ошибки не распознаются:
fi (a == f(x)).
Регулярные выражения
E – регулярное выражение
L(E) – язык регулярного выражения
Базис:
Константы и являются регулярными выражениями, определяющие языки L() = {} и L() = .
Если a – произвольный символ, то a – регулярное выражение, определяющее язык L(a) ={a}
Индукция:
Если E и F – регулярные выражения, то E+F – регулярное выражение (объединение)
Если E и F – регулярные выражения, то EF – регулярное выражение (конкатенация)
Если E – регулярное выражение, то Е* - регулярное выражение, определяющее итерацию языка L(E). Т.е. L(E*) = (L(E))*
Если E – регулярное выражение, то (Е) - регулярное выражение, определяющее тот же язык L(E), что и E. Т.е. L((E)) = L(E)
Пример 7. Задать множество цепочек, чередующихся нулей и единиц:
010101…01
101010...10
0101010
1010101
Решение №1:
(01)* + (10)* + 0(10)* + 1(01)*
Решение №2:
(+1)(01)*(+0)
G = <{0,1, }, {S,A,B,C}, {S}, R>
R:
S ABC
A 1 |
B 01B | 01
C 0 |