
- •Курсовая работа
- •Содержание
- •Введение
- •1 Постановка задачи
- •2 Формальная модель задачи
- •Цепочка, которая не содержит ни одного символа, называется пустой цепочкой и обозначается .
- •Цепочка , для которой существует выводS*, называется сентенциальной формой или сентенцией в грамматике .
- •Расширение допускает единственное -правило вида s, но в этом случае начальный символ грамматики s не должен встречаться в правых частях правил.
- •2.1 Расширенные Формы Бэкуса – Наура
- •Операции языка:
- •Правила, определяющие идентификатор, букву и цифру:
- •Правило, определяющее оператор программы (пятая цифра варианта).
- •2.2 Формальные грамматики
- •2.3 Диаграммы Вирта
- •3 Спецификация основных процедур и функций
- •3.1 Лексический анализатор
- •3.2 Синтаксический анализатор
- •3.3 Семантический анализатор
- •3.4 Генерации внутреннего представления программы
- •Перевод в полиз операторов. Каждый оператор языка программирования может быть представлен как n-местная операция с семантикой, соответствующей семантике оператора.
- •Составной оператор {s1; s2;...; Sn } в полиЗе записывается как s1 s2... Sn.
- •3.5 Интерпретатор программы
- •4 Структурная организация данных
- •4.1 Спецификация входной информации
- •4.2 Спецификация выходной информации
- •5 Разработка алгоритма решения задачи
- •6 Установка и эксплуатация программного средства
- •7 Работа с программным средством
- •Заключение
- •Список использованных источников
- •Приложение а
- •Приложение б Примеры программ на модельном языке
- •Приложение в Цепочка вывода и дерево разбора
- •Приложение г Примеры таблиц идентификаторов и двуместных операций
- •Приложение д полиз и интерпретация программы
- •Здесь используются следующие обозначения:
- •Приложение е Контрольный пример
- •Приложение ж Список ошибок, выводимых программой
- •Приложение з Текст программы
2.3 Диаграммы Вирта
Описание синтаксиса модельного языка М с помощью диаграмм Вирта представлено на рисунке 1.
целое
выражение оператор оператор Условный присваивания выражение оператор Фиксированного
цикла
3 Спецификация основных процедур и функций
3.1 Лексический анализатор
Лексический анализатор (ЛА) – это первый этап процесса компиляции, на котором символы, составляющие исходную программу, группируются в отдельные минимальные единицы текста, несущие смысловую нагрузку – лексемы.
Задача лексического анализа - выделить лексемы и преобразовать их к виду, удобному для последующей обработки. ЛА использует регулярные грамматики.
ЛА необязательный этап компиляции, но желательный по следующим причинам:
1) замена идентификаторов, констант, ограничителей и служебных слов лексемами делает программу более удобной для дальнейшей обработки;
2) ЛА уменьшает длину программы, устраняя из ее исходного представления несущественные пробелы и комментарии;
3) если будет изменена кодировка в исходном представлении программы, то это отразится только на ЛА.
В процедурных языках лексемы обычно делятся на классы:
служебные слова;
ограничители;
числа;
идентификаторы.
Каждая лексема представляет собой пару чисел вида (n, k), где n – номер таблицы лексем, k - номер лексемы в таблице.
Входные данные ЛА - текст транслируемой программы на входном языке.
Выходные данные ЛА - списковая структура, содержащая лексемы в числовом представлении.
Для модельного языка М таблица служебных слов 1:
1. if 2. then 3. else 4. for
5. to 6. do 7. true 8. false
9. while 10. read 11. write 12. and
13. not 14. real 15. boolean
16. integer 17. as 18. or
Таблица ограничителей 2:
1. ; 2. { 3. } 4. ,
5. ( 6. ) 7. : 8. \n
9. . 10. /* 11. */ 12. <>
13. = 14. < 15. <= 16. >
17. >= 18. + 19. - 20. * 21. /
Таблицы идентификаторов (3), целых чисел (4) и вещественных чисел (5) формируются в ходе лексического анализа.
Опишем результаты работы лексического анализатора для модельного языка М.
Входные данные ЛА: { i,n,f:integer; read(n); }
Выходные данные ЛА:
(2;2)(3;1)(2;4)(3;2)(2;4)(3;3)(2;7)(1;16)(2;1)(1;10)(2,5)(3;2)(2,6)(2;1)(2;3)
Анализ
текста проводится путем разбора по
регулярным грамматикам и опирается на
способ разбора по диаграмме состояний,
снабженной дополнительными
пометками-действиями. Смысл конструкции:
если текущим является состояние А
и очередной входной символ совпадает
с
для какого либо
i,
то осуществляется переход в новое
состояние В,
при этом выполняются действия D1,
D2,
…, Dm.
Для удобства разбора вводится дополнительное состояние диаграммы ER, попадание в которое соответствует появлению ошибки в алгоритме разбора. Переход по дуге, не помеченной ни одним символом, осуществляется по любому другому символу, кроме тех, которыми помечены все другие дуги, выходящие из данного состояния.
Алгоритм. Разбор цепочек символов по ДС с действиями
Шаг 1. Объявляем текущим начальное состояние в диаграмме состояний H.
Шаг 2. До тех пор, пока не будет достигнуто состояние ER или конечное состояние диаграммы состояний, считываем очередной символ анализируемой строки и переходим из текущего состояния диаграммы состояний в другое по дуге, помеченной этим символом, выполняя при этом соответствующие действия. Состояние, в которое попадаем, становится текущим.
Таблица 3 - Спецификация основных процедур и функций лексического анализатора
Название функции |
Назначение функции |
Входные данные |
Выходные данные |
private void scanner() |
Функция, выполняющая лексический анализ программы |
Программа на входном языке |
Файл лексем в числовом представлении |
private void Get_Ident() |
Функция, определяющая идентификатор |
Символ |
Логическая константа |
private void Get_Num() |
Функция, определяющая число |
Символ |
Логическая константа |
private void DecToDec() |
Функция преобразования десятичных чисел из строки в число |
Символ |
Логическая константа |
private void HexToDec() |
Функция преобразования шестнадцатеричных чисел из строки в число |
Символ |
Логическая константа |
private void OctToDec() |
Функция преобразования восьмеричных чисел из строки в число |
Символ |
Логическая константа |
private void BinToDec() |
Функция преобразования двоичных чисел из строки в число |
Символ |
Логическая константа |
private void Flush(int tab) |
Записывает лексемы в соответствующие таблицы из буфера |
- |
- |
private void Clear()
|
Очищает буфер |
– |
– |
Диаграмма состояний с действиями для модельного языка
Рисунок 1 – Диаграмма состояний с действиями для модельного языка М