- •Введение
- •Порождающие грамматики Хомского Цель
- •Неограниченные грамматики
- •Контекстно зависимые грамматики
- •Контекстно свободные грамматики
- •Автоматные грамматики
- •Эквивалентность грамматик
- •Однозначность грамматик
- •Задачи и упражнения
- •Контрольные вопросы
- •Конечный автомат
- •Детерминированный конечный автомат
- •Построение дка из -нка
- •Задачи и упражнения
- •Контрольные вопросы
- •Регулярные грамматики. Лексический анализатор. Роль лексических анализаторов
- •Лексические ошибки
- •Регулярные выражения
- •Преобразование регулярного выражения в автомат
- •Распознание токенов
- •Задачи и упражнения
- •Контрольные вопросы
- •Автоматы с магазинной памятью
- •Нисходящие методы разбора Устранение левой рекурсии
- •Левая факторизация
- •Метод рекурсивного спуска
- •Пример нисходящего интерпретатора
- •Задачи и упражнения
- •Контрольные вопросы
Задачи и упражнения
Задайте грамматику в соответствие с заданием по варианту (см. Таблица 1);
Задайте регулярную грамматику для распознавания токенов в грамматиках задания №1.
Постройте -НКА для регулярных грамматик из задания №2.
Дополнительные задачи:
(а | b)*
(a* | b*)*
(( | a) b*)*
(a | b)*abb(a | b)*
Преобразуйте полученные в задании №3 -НКА в ДКА.
Постройте ДКА для регулярных грамматик из задания №3. Сравните результаты с полученными решениями в задаче №4.
Минимизируйте число состояний ДКА, полученных в результате выполнения заданий №4,5.
Подготовьте тестовые случаи для полученных автоматов. Напишите программы для моделирования -НКА и ДКА.
Таблица 5. Задания по вариантам.
Задания по вариантам |
|
|
Объявление условного оператора if в языке Pascal. |
|
Объявление условного оператора if в языке C/C++/C#. |
|
Объявление оператора цикла while/repeat в языке Pascal. |
|
Объявление оператора цикла while/do while в языке C/C++/C#. |
|
Объявление оператора switch в языке С/С++/С#. |
|
Объявление оператора case в языке Pascal. |
|
Объявление оператора for в языке Pascal. |
|
Объявление оператора for в языке C/C++/C#. |
|
Объявление оператора foreach в языке С#. |
|
Объявление унарных выражений (+x; -x; !x; ~x; ++x; --x; (T)x)в языке С/С++/С#. |
|
Объявление операторов отношения и приведения типов в С# (x<y; x>y; x>=y; x<=y; x!=y; x is T; x as T). |
|
Объявление констант в Pascal. |
|
Объявление констант в C++/C#. |
|
Объявление блока объявления переменных в Pascal. |
|
Объявление объявления функции (процедуры) в Pascal. |
|
Объявление объявления функции в С++/С. |
|
Объявление блока объявления типов в Pascal. В блоке распознаются только объявления записей (record). Считать содержимое записи блоком кода без проведения дополнительного лексического анализа. |
|
Объявление операторов new/delete в C++ |
|
Объявление объявления класса в С++ (считать содержимое класса блоком кода без проведения дополнительного лексического анализа) |
|
Объявление объявления класса в блоке объявления типов в Object Pascal (считать содержимое класса блоком кода без проведения дополнительного лексического анализа) |
|
Объявление объявления массивов в языке С#. |
|
Объявление объявления массивов в языке Pascal. |
|
Объявление арифметических выражений в языке Pascal. |
|
Объявление арифметических выражений в языке C#. |
|
Объявление события в языке С#. |