
- •Курсовая работа
- •Содержание
- •Введение
- •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 Работа с программным средством
- •Заключение
- •Список использованных источников
- •Приложение а
- •Приложение б Примеры программ на модельном языке
- •Приложение в Цепочка вывода и дерево разбора
- •Приложение г Примеры таблиц идентификаторов и двуместных операций
- •Приложение д полиз и интерпретация программы
- •Здесь используются следующие обозначения:
- •Приложение е Контрольный пример
- •Приложение ж Список ошибок, выводимых программой
- •Приложение з Текст программы
3.3 Семантический анализатор
В ходе семантического анализа проверяются отдельные правила записи исходных программ, которые не описываются КС-грамматикой. Эти правила носят контекстно-зависимый характер, их называют семантическими соглашениями или контекстными условиями.
Рассмотрим пример построения семантического анализатора для программы на модельном языке М. Соблюдение контекстных условий для языка М предполагает три типа проверок:
1) обработка описаний;
2) анализ выражений;
3) проверка правильности операторов.
В оптимизированном варианте синтаксический и семантический анализаторы совмещены и осуществляются параллельно. Поэтому процедуры семантического анализатора будем внедрять в ранее разработанные процедуры синтаксического анализатора.
Вход: файл лексем в числовом представлении.
Выход: заключение о семантической правильности программы или о типе обнаруженной семантической ошибки.
Обработка описаний. Задача обработки описаний – проверить, все ли переменные программы описаны правильно и только один раз.
Таблица идентификаторов, введенная на этапе лексического анализа, расширяется, приобретая вид таблицы 1.
Анализ выражений. Задача анализа выражений – проверить описаны ли переменные, встречающиеся в выражениях, и соответствуют ли типы операндов друг другу и типу операции.
Эти задачи решаются следующим образом. Вводится таблица двуместных операций (таблица 2) и стек, в который в соответствии с разбором выражения B заносятся типы операндов и знак операции. После семантической проверки в стеке оставляется только тип результата операции. В результате разбора всего выражения в стеке остается тип этого выражения.
Проверка правильности операторов
Задачи проверки правильности операторов:
1) выяснить, все ли переменные, встречающиеся в операторах, описаны;
2) установить соответствие типов в операторе присваивания слева и справа от символа «as»;
3) определить, является ли выражение E в операторах условия и цикла булевым.
Задача решается проверкой типов в соответствующих местах программы.
Таблица 5 - Спецификация основных процедур и функций семантического анализатора
-
Название функции
Назначение функции
Входные данные
Выходные данные
private void MakeTableOperations()
Составляет таблицу операций
-
-
private string CheckOperandTypes(string op1, string operation, string op2)
Проверяет соответствие типов по таблице
op1 – первый тип, operation –операция, op2 – второй тип
Тип получаемый в результате операции, либо “Error”, если операция неприменима
private Type Get_type(int op, Type t1, Type t2)
Функция, возвращающая результирующий тип операции
-
-
3.4 Генерации внутреннего представления программы
В ПОЛИЗе операнды записаны слева направо в порядке использования. Знаки операций следуют таким образом, что знаку операции непосредственно предшествуют его операнды.
Пример 1: Для выражения в обычной (инфиксной записи) a*(b+c)-(d-e)/f ПОЛИЗ будет иметь вид: abc+*de-f/-.
Справедливы следующие формальные определения.
Определение: Если B является единственным операндом, то ПОЛИЗ выражения B – это этот операнд.
Определение:
ПОЛИЗ
выражения B1
B2,
где
- знак бинарной операции, B1
и B2
– операнды для ,
является запись
,
где
-
ПОЛИЗ выраженийB1
и B2
соответственно.
Определение:
ПОЛИЗ
выражения B,
где
- знак унарной
операции, а B
– операнд ,
есть запись
,
где
-
ПОЛИЗ выраженияB.
Определение: ПОЛИЗ выражения (B) есть ПОЛИЗ выражения B.