- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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.4 Восстановление после ошибок
Ошибка в процессе предиктивного синтаксического анализа обнаруживается в тот момент, когда терминал на вершине стека не соответствует очередному входному символу или когда на вершине стека находится нетерминал A, очередной входной символ – a, а ячейка синтаксического анализа M[A,a] содержит error(т.е. данная запись таблицы пуста).
Простейшим способом восстановления после ошибок является восстановление “в режиме паники”. Этот способ основан на пропуске символов из входного потока до тех пор, пока не будет обнаружен токен из предопределённого множества синхронизирующих токенов.Запись synв таблице синтаксического анализа указывает такой токен.Эффективность этого метода зависит от выбора синхронизирующего множества. Эти множества выбираются так, чтобы синтаксический анализатор быстро восстанавливался после часто встречающихся на практике ошибок.Далее приведены эвристики, используемые при реализации этого метода:
В качестве первого приближения в синхронизирующее множество для нетерминала A помещаются все символы из множества FOLLOW(A).Если пропустить все токены до элементов изFOLLOW(A) и снять A со стека, вероятно, удастся продолжить синтаксический анализ;
К синхронизирующему множеству конструкций нижнего уровня можно добавить символы, с которых начинаются конструкции более высокого уровня. Например, добавить ключевые слова, с которых начинаются инструкции, в синхронизирующие множества нетерминалов, порождающих выражения;
Если добавить символы из FIRST(A) в синхронизирующее множество для нетерминалов, станет возможным продолжение анализа в соответствии с A, когда во входном потоке появится символы из FIRST(A);
Если нетерминал может порождать пустую строку, то в качестве продукции по умолчанию может использоваться продукция, порождающая ε;
Если терминал на вершине стека не может быть сопоставлен с входным символом, то простейший метод состоит в снятии терминала со стека, генерации сообщения об ошибке и продолжении синтаксического анализа. По сути, при этом подходе синхронизирующее множество токена состоит из всех остальных токенов.
Таблица синтаксического анализа, дополненнаясинхронизирующими записями, используется следующим образом. Если синтаксический анализатор просматривает ячейку M[A,a]и обнаруживает, что она пуста, то входной символ aпропускается. Если в этой ячейке находится запись syn, то нетерминал снимается со стека в попытке продолжить синтаксический анализ. Если токен на вершинестека не соответствует входному символу, то, как упоминалось выше,он снимается со стека. Очевидно из выше сказанного, что такой способ восстановления не перестраивает синтаксическое дерево, т.е. все действия производятся только над символами, находящимися после места возникновения ошибки. Такие стратегии восстановления после ошибки относят к локальным.
Восстановление “в режиме паники” наиболее эффективнов таких случаях, когда несколько ошибок в одном операторе встречаются редко. На самом деле, этопочти всегда так. По статистике 80% неверных операторов имеют только одну ошибку, 13% - две [8].
