
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •1 Языковые процессоры
- •1.1 Практическое применениеискусственных языков
- •1.2 Практический пример
- •1.3 Понятие и структура языкового процессора
- •2Обзор существующих систем и обоснование выбора инструментальных средств и класса грамматики
- •2.1 Обзор существующей символьной спецификации моделей гс в среде исма
- •2.1.1 Лексемы языка исма
- •2.1.2 Грамматика языка исма
- •2.1.3 Семантические действия в языковом процессоре исма
- •2.1.4 Заключение
- •2.2 Обоснование выбора инструментальных средств и класса грамматики
- •3 Постановка задачи исследования
- •3.1 Характеристика задачи исследования
- •3.2 Входная информация
- •3.3 Выходная информация
- •3.4 Архитектура среды исма с расширенным языком описания гс
- •4 Программно-математическое обеспечение
- •4.1Лексический анализатор
- •4.1.1 Функции лексического анализатора
- •4.1.2 Спецификация токенови входного алфавита символов
- •4.1.3 Распознавание токенов
- •4.1.4 Иерархия классов модуля
- •4.2 Синтаксический анализатор
- •4.2.1 Функции синтаксического анализатора
- •4.2.2 Спецификация грамматики
- •4.2.3 Метод разбора
- •4.2.4 Восстановление после ошибок
- •4.2.5 Иерархия классов модуля
- •4.3 Семантический анализ
- •4.3.1 Промежуточное представление программы
- •4.3.2 Грамматика с семантическими правилами
- •4.3.3 Модифицированныйметодразбора
- •4.3.4 Семантический анализ. Таблица символов
- •4.3.5 Семантический анализ. Проверка корректности типа
- •4.4 Генерация кода
- •4.5 Система сбора диагностических сообщений
- •5 Тестирование
- •5.1 Лексический анализатор
- •5.2 Синтаксическийанализатор
- •5.3 Семантический анализатор
- •Заключение
- •Список использованных источников
- •ПриложениеA Диагностические сообщения
- •Диагностические сообщения сканера
- •Диагностические сообщения парсера
- •Диагностические сообщения семантического анализатора
- •ПриложениеБ
- •Б.1.3 Установка системы
- •Б.2 Работа с системой б.2.1 Запуск системы и начало работы
- •Б.2.2Ввод программной модели
- •Б.2.3Трансляция модели и просмотр результата
- •Б.2.4Сохранение программной модели
- •Б.2.6Завершение работы с системой
- •Приложение в
- •Листинг программы
- •В.1 Модуль лексического анализатора
- •Файл abstractLexer.H
- •Файл lexer.H
- •Файл lexer.Cpp
- •В.2 Модуль синтаксического анализатора Файл abstractParser.H
- •Файлparser_ll1.H
- •Файл parser_ll1.Cpp
- •В.3 Модуль семантического анализатора Файл symbolTable.H
- •Файл SymbolTableFactory.H
- •Файл checker.H
- •В.4 Модулькодогенератора ФайлastVisitor.H
- •Файл astCodeGen.H
1.2 Практический пример
В качестве примера таких моделей ГС рассмотрим задачу, описывающую проникновение помеченных радиоактивной меткой антител в пораженную опухолью ткань живого организма.
Рассматривается система одномерных уравнений реакции-диффузии:
(1.1)
Дискретизации производных первого и второго порядков по пространственной переменной соответственно имеют вид:
.
Значения
и
получены из граничных условий, они имеют
вид
и
.
Полагая
и
,
эта задача записывается в виде:
, (1.2)
где
–
задаваемый пользователем параметр,
определяющий размерность системы (1).
Функция
определяется формулами:
(1.3)
где
(1.4)
Функция
задана следующим образом:
Подходящими
значениями для параметров
,
и
являются
,
и
.
Из-за требований
к точности результатов моделирования,
задача имеет высокую размерность. Так
для случая
,
система (1.2) состоит из 400 уравнений.
1.3 Понятие и структура языкового процессора
Языковой процессор (транслятор) – это программа, которая считывает текстпрограммы, написанной на одном языке – исходном, и транслирует (переводит) его в эквивалентный текст на другом языке – целевой (рис.1.1) . С практической точки зрения в языковых процессорах можно выделить отдельные фазы анализа и синтеза.
Рисунок 1.1 –Языковой процессор
Анализ разбивает исходную программу на составные части и накладывает на них грамматическую структуру. Затем он использует эту структуру для создания промежуточного представления исходной программы. Если анализ обнаруживает, что исходная программа неверно составлена синтаксически либо дефектна семантически, он должен выдать информативные сообщения об этом, чтобы пользователь мог исправить обнаруженные ошибки. Анализ также собирает информацию об исходной программе и сохраняет её в структуре данных, именуемой таблицей символов, которая передается вместе с промежуточным представлением синтезу.
Синтез строит требуемую целевую программу на основе промежуточного представления и информации из таблиц символов. Типичное разложение простого языкового процессора на фазы приведено на рис. 1.2.
Рисунок 1.2 – Фазы языкового процессора
Первая фаза анализа называется лексическим анализом или сканированием. Лексический анализатор читает поток символов, составляющих исходную программу, и группирует эти символы в значащие последовательности, называющиеся лексемами. Для каждой лексемы анализатор строит выходной токен (token) вида:
< имя_токена, значение атрибута >
Он передаётся последующей фазе, синтаксическому анализу. Первый компонент токена, имя_токена, представляет собой абстрактный символ (терминал), использующийся во время синтаксического анализа, а второй компонент, значение_атрибута , указывает на запись в таблице символов, соответствующую данному токену. Информация из записи в таблице символов необходима для семантического анализа и генерации кода.
Вторая фаза компилятора – синтаксический анализ или разбор (parsing). Анализатор использует первые компоненты токенов, полученных при лексическом анализе, для создания древовидного промежуточного представления, которое описывает грамматическую структуру потока токенов. Типичным представлением является синтаксическое дерево, в котором каждый внутренний узел представляет операцию, адочерние узлы – аргументы этой операции.
Семантический анализатор использует синтаксическое дерево и информацию из таблицы символов для проверки исходной программы на семантическую согласованность с определением языка. Он так же собирает информацию о типах и сохраняет её в таблице символов для последующего использования в процессе генерации промежуточного кода. Важной частью семантического анализа является проверка типов, когда языковой процессор проверяет, имеет ли каждый оператор операнды соответствующего типа. Кроме проверки типов он может проверять и другие семантические правила.
Генератор кода получает в качестве входных данных промежуточное представление исходной программы и отображает его в целевой язык [2].