
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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
4.2.5 Иерархия классов модуля
На рис. 4.6 представлена иерархия классов синтаксического анализатора. Где AbstractParser– интерфейсный класс;Parser_LL1–реализациякласса AbstractParser.
Использование интерфейсного класса в архитектуре приложения даёт возможности поменять реализацию синтаксического анализатора без изменения других модулей.
Рисунок 4.6 – Иерархия классов синтаксического анализатора
Листинг этого модуля представлен в ПриложенииВ в разделе синтаксический анализатор.
4.3 Семантический анализ
4.3.1 Промежуточное представление программы
Промежуточное представление программы – это структура данных, которая строится в процессе синтаксического анализа и необходима для дальнейших фаз языкового процессора таких, как семантический анализ, генерация кода.
Одним из видов промежуточных представлений является синтаксическое дерево или абстрактное синтаксическое дерево. Абстрактное синтаксическое дерево - это дерево, каждый узел которого представляет конструкцию языка, например оператор; его дочерние узлы представляют значащие компоненты конструкции, например операнды.В отличие от дерева разбора, в котором внутренниеузлы представляют нетерминалы, синтаксическое дерево не содержит “вспомогательных” конструкций таких, как множители(factor), слагаемые (term) и др.
Узлы синтаксического дерева реализованы при помощи классов. Каждый класс соответствует определённому виду конструкций языка и имеет определённое количество дочерних узлов (указателей на дочерние узлы), за исключениемлистовых узлов, таких как идентификатор или константа.При программной реализации был использован паттерн компоновщик, который компонует объекты в древовидные структуры для представления иерархий часть-целое. В рамках этого паттерны все классы делятся на “примитивы” (листовые элементы) и на “контейнеры” (внутренние узлы), при этом все классы унаследованы от общего абстрактного класса. Поэтому используя интерфейс абстрактного класса можно единообразно обращаться как к листовым элементам, так и внутренним узлам иерархии[4].
Также при проектированииклассов для узлов синтаксического дерева было учтено разделение всех конструкций языка на следующие группы:
операции(Expr)
операторы(Stmt)
Примером конструкций для операций будут арифметические и логические выражения, вызов функции, операция индексации, переменная, целая константа и др. Примером операторов или инструкций является условный оператор, конструкция уравнения, задание глобального или локального начального условия, а также целый класс конструкций объявлений(Decl) отнесён к типу оператор. Такое деление позволяет выделить основные базовые классы Expr иStmt, также среди производных классов для Expr были выделены базовые подклассы арифметических (Arith), логических(Logical) и листовых выражений(Leaf), а для Stmt – базовый подкласс объявлений(Decl).Так же были введены вспомогательные классы такие, как список операторов (Seq)и операций(ListExpr)представляющие линейные однонаправленные списки соответственно операторов и операций.
Полученная иерархия типовпредставлена на рис. 4.7, где Node- абстрактный класс, который представляет общий интерфейс для клиентов; Program– этопроизводный от Nodeкласс, представляет контейнер для списков конструкцийиз трёх основных частей программы: блока объявлений, классической части и гибридной части;Expr– производный от Nodeкласс, являетсяобщим абстрактным классом для конструкций, относящихся к типу операция, и содержит специфичные для них методы;классыVer,Func, Access–являются конкретными реализациями конструкций относящихся к типу операций, причём в рамках паттерна компоновщик они являются“контейнерами”;класс ListExpr– вспомогательный класс, реализующий список выражений, используется при разборе параметров функции; классы Arith, Logical и Leafявляются базовыми классами для групп конструкций: арифметических операций, логических операций, и листовых элементов(идентификаторы и константы), все эти классы являются “контейнерами” и реализуют специфичные для этих групп методы; классы UnaryMinus,
Рисунок 4.7 – Иерархия классов синтаксического дерева
DivExp, MulExp, MinusExp, PlusExpпредставляют реализации арифметических операций: унарный минус и бинарное деление, умножение, разность и сумма; аналогично классы And, Or, UnaryNot, Eq, Ne, Less, Gr, Ge, Leпредставляют логические операции: конъюнкция, дизъюнкция,отрицание, “==”, “!=”,”<”,”>”,”>=”, “<=”; Id, ConstantInt, ConstantFloat–реализации классов идентификатора, целой и вещественной константы; Stmt–класс аналогичный классу Expr, только для операторов; классы SetGlobal, SetGlobalIndex, SetLocal, SetLocalIndex, Equation, EquationIndex, LocalState, If – являются конкретными реализациями соответствующих операторов: задание глобальных начальных условий (ГНУ),задание ГНУ в индексной форме, задание локальных начальных условий (ЛНУ), задание ЛНУ в индексной форме, уравнение, уравнение в индексной форме,локальное состояние, условный оператор , все эти классы являются “контейнерами”;класс Declarявляется базовым классомдля операторов декларации переменных;классы DeclArray, DeclConst, DeclMacro, DeclCount соответственно являются реализациями объявлений массива, константы, макроса, счётчика, они являются “контейнерами”; класс Seq– вспомогательный класс, реализующий список операторов.