Автор: Пользователь скрыл имя, 19 Мая 2012 в 17:24, курсовая работа
Теория формальных языков, грамматик и автоматов составляет фундамент синтаксических методов. Основы этой теории были заложены Н. Хомским в 40–50-е годы XX столетия в связи с его лингвистическими работами, посвященными изучению естественных языков. Но уже в следующем десятилетии синтаксические методы нашли широкое практическое применение в области разработки и реализации языков программирования.
Введение 3
1 Постановка задачи 4
2 Формальная модель задачи 5
3 Структура программы………………………………………………….....16
3.1 Лексический анализатор 16
3.2 Синтаксический анализатор 18
3.3 Семантический анализатор 20
3.4 Генерация ПОЛИЗа программы 22
3.5 Интерпритация ПОЛИЗа программы 24
4 Структурная организация данных 31
4.1 Спецификация входной информации 31
4.2 Спецификация выходной информации 31
4.3 Спецификация процедур и функций 31
5 Разработка алгоритма решения задачи 32
5.1 Укрупненная схема алгоритма программного средства 32
5.2 Детальная разработка алгоритмов отдельных подзадач 33
6 Установка и эксплуатация программного средства 34
7 Работа с программным средством 35
Заключение 36
Список использованных источников 37
Приложение А – Текст программы 38
program
var integer a,b;
begin
read(a,b);
if a>b then
write (a)
else write (b)
end.
Выходные данные ЛА: { (1,1) (1,2) (1,20),(4.1),(2,18),(4.2) (2,12) (1,3) (1,12) (2,14) (4,1) (2,18) (4,2) (2,15) (2,12) (1,14) (4,1) (2,7) (4,2) (1,15) (1,13) (2,14) (4,1) (2,15) (1,16) (1,13) (2,14) (4,2) (2,15)(1,4),(2,19) }
Анализ текста проводится путем разбора по регулярным грамматикам и опирается на способ разбора по диаграмме состояний, снабженной дополнительными пометками-действиями. Смысл этой конструкции: если текущим является состояние А и очередной входной символ совпадает с для какого либо i, то осуществляется переход в новое состояние В, при этом выполняются действия D1, D2, …, Dm.
Для удобства разбора вводится дополнительное состояние диаграммы ER, попадание в которое соответствует появлению ошибки в алгоритме разбора.
Переход по дуге, не помеченной ни одним символом, осуществляется по любому другому символу, кроме тех, которыми помечены все другие дуги, выходящие из данного состояния.
Алгоритм. Разбор цепочек символов по ДС с действиями
Шаг 1. Объявляем текущим начальное состояние в диаграмме состояний H.
Шаг 2. До тех пор, пока не будет достигнуто состояние ER или конечное состояние диаграммы состояний, считываем очередной символ анализируемой строки и переходим из текущего состояния диаграммы состояний в другое по дуге, помеченной этим символом, выполняя при этом соответствующие действия. Состояние, в которое попадаем, становится текущим.
Составим ЛА для модельного языка М. Предварительно введем следующие обозначения для переменных, процедур и функций.
Переменные:
1) СН – очередной входной символ;
TI – таблица идентификаторов программы, TC – таблица чисел;
4) z - номер лексемы в таблице t (если лексемы в таблице нет, то z=0).
Процедуры и функции:
1) gc – процедура считывания очередного символа текста в переменную СН;
2) let – логическая функция, проверяющая, является ли переменная СН буквой;
3) digit - логическая функция, проверяющая, является ли переменная СН цифрой;
4) nill – процедура очистки буфера S;
5) add – процедура добавления очередного символа в конец буфера S;
6) look(n,k) – процедура поиска лексемы из буфера S в таблице с номером n с возвращением номера лексемы в таблице, k – количество элементов в таблице;
7) put(t) – процедура записи лексемы из буфера S в таблицу t, если там не было этой лексемы, иначе возвращает номер данной лексемы в таблице;
8) out(n, k) – процедура записи пары чисел (n, k) в файл лексем;
Диаграмма состояний с
Рисунок
1 – Диаграмма состояний с
3.2
Синтаксический анализатор
Задача синтаксического анализатора (СиА) - провести разбор текста программы, сопоставив его с эталоном, данным в описании языка. Для синтаксического разбора используются контекстно-свободные грамматики.
Один
из эффективных методов
Входные данные – файл лексем в числовом представлении.
Выходные
данные – заключение о синтаксической
правильности программы или сообщение
об имеющихся ошибках.
Цепочка вывода и дерево разбора
Рассмотрим пример следующей программы:
program var int a,b; begin for a ass 1 to 3 do b ass b+1; end
Дерево разбора
3.3 Семантический анализатор программы
В ходе семантического анализа проверяются отдельные правила записи исходных программ, которые не описываются КС-грамматикой. Эти правила носят контекстно-зависимый характер, их называют семантическими соглашениями или контекстными условиями.
Рассмотрим пример построения семантического анализатора (СеА) для программы на модельном языке М. Соблюдение контекстных условий для языка М предполагает три типа проверок:
1) обработка описаний; 2) анализ выражений;
3) проверка правильности операторов.
В оптимизированном варианте СиА и СеА совмещены и осуществляются параллельно. Поэтому процедуры СеА будем внедрять в ранее разработанные процедуры СиА.
Обработка описаний. Задача обработки описаний – проверить, все ли переменные программы описаны правильно и только один раз. Решается расширением таблицы идентификаторов.
Задача анализа выражений – проверить описаны ли переменные, встречающиеся в выражениях, и соответствуют ли типы операндов друг другу и типу операции. Эти задачи решаются следующим образом. Вводится таблица двуместных операций (таблица 2) и стек, в который в соответствии с разбором выражения B заносятся типы операндов и знак операции. После семантической проверки в стеке оставляется только тип результата операции. В результате разбора всего выражения в стеке остается тип этого выражения.
Пример. Дано выражение b-4+8. Дерево разбора выражения:
real |
- | integer | + | integer |
real |
+ | integer |
real |
Рисунок
2 – Анализ выражения b-4+8
Проверка правильности операторов
Задачи проверки правильности операторов:
1) выяснить, все ли переменные, встречающиеся в операторах, описаны;
2) установить соответствие типов в операторе присваивания слева и справа от символа «ass»;
3) определить, является ли выражение E в операторах условия и цикла булевым.
Задача
решается проверкой типов в
Пример таблицы идентификаторов
Таблица 1 – Таблица идентификаторов на этапе семантического анализа
Номер | Идентификатор | адрес | тип |
1 | a | 0 | integer |
2 | b | 0 | integer |
3 | c | 0 | real |
4 | d | 0 | boolean |
Пример таблицы двуместных операций
Таблица 2 – Таблица двуместных операций
Операция | Тип 1 | Тип 2 | Тип результата |
+, -, * | integer | integer | integer |
/ | integer | integer | real |
+, -, *,/ | integer | real | real |
+, -, *,/ | real | integer | real |
+, -, *,/ | Real | real | real |
<,>,<=,>=,= | integer | integer | boolean |
<,>,<=,>=,= | integer | real | boolean |
<,>,<=,>=,= | real | integer | boolean |
<,>,<=,>=,= | real | real | boolean |
and, or | boolean | boolean | boolean |