
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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 Программно-математическое обеспечение
4.1Лексический анализатор
4.1.1 Функции лексического анализатора
Лексический анализ – первая стадия анализа исходного текста программы, предназначенная для группировки терминальных символов входной цепочки в более крупные конструкции – лексемы. Этот процесс называется процессом лексемной декомпозиции. Лексический анализатор также называют сканером (лексером).
В процессе декомпозиции каждая распознанная лексема однозначно отображается в токен. Токенпредставляет собой пару, состоящую из имени токена и необязательного атрибута. Имя токена – это абстрактный символ, представляющий тип лексемы, например конкретное ключевое слово или последовательность входных символов, составляющих идентификатор. Имена токенов являются входными символами, обрабатываемыми синтаксическим анализатором.
Атрибутами токена являются:
–внутреннее представление лексемы, например строка или целочисленная константа.Это необязательный атрибут, его наличие зависит от типа лексемы;
– номер строки занимаемой лексемой в исходном тексте программы. В дальнейшем этот номер используется для локализации пользователем обнаруженной ошибки.
Лексический анализатор также реализует дополнительные функции:
контроль принадлежности терминального символа алфавиту входного языка с соответствующей диагностикой;
удаление из текста программы не несущих смысловой нагрузки символов (пользовательских комментариев, пробелов, символов табуляции и новой строки), использующихся для разделения токенов друг от друга во входной цепочке символов;
согласование сообщений об ошибках путем указания номера строки, в которой была сгенерирована ошибка;
контроль правильности лексемс соответствующей диагностикой;
контроль выхода за границу вещественного и целого типа (underflow, overflow) при преобразовании числовых лексем во внутреннее представление.
Теоретически, задачи, решаемые сканером, можно возложить на синтаксический анализатор. Но такой подход нецелесообразен по следующим причинам:
замена цепочек символов, представляющих элементарные конструкции языка, делает внутреннее представление программы более удобным для дальнейшего анализа синтаксическим анализатором, упрощает его реализацию. Последний манипулирует не отдельными символами, а законченными элементарными конструкциями, что облегчает их общее восприятие и дальнейший семантический анализ. Кроме этого, при построении лексем может осуществляться простейшая семантическая обработка. Например, преобразование и проверка числовых констант;
уменьшается длина программы, поступающей в синтаксический анализатор, за счет устранения из нее несущественных для дальнейшего анализа пробелов, комментариев, игнорируемых символов. Уменьшение размера текста повышает производительность распознавателя на последующих стадиях анализа;
один и тот же язык программирования может иметь различные внешние представления элементарных конструкций. Поэтому, наличие нескольких лексических анализаторов, порождающих на выходе одно и то же множество лексем, позволяет не переписывать синтаксический анализатор. Написать новый лексический анализатор намного проще, чем синтаксический;
лексический анализатор использует более специализированные, по сравнению с синтаксическим анализатором, методы разбора. Следовательно, на одних и тех же цепочках и при выполнении разбора одних и тех же конструкций его производительность будет выше;
блок лексического анализа естественным образом вписывается в иерархическую структуру языкового процессора, что тоже немаловажно при системном подходе к разработке языковых процессоров.